Я использую jsdom с jquery, и он работает просто отлично. Тем не менее, я пытаюсь немного модулировать свой код, чтобы не повторяться, поэтому я сделал базовую функцию из некоторого кода jsdom, который принимает некоторый html (DOM), настраивает его с помощью jquery и выплевывает обратно , Однако я не могу вернуть свой результат и, таким образом, присвоить его вызывающей переменной. Я, вероятно, не вернусь в нужное место, но я просто не вижу очевидного, если это так. Могли бы воспользоваться небольшой помощью.
Вот код:
function tweakIt(html_in){
var jsdom = require('jsdom');
jsdom.env({
html: html_in,
scripts: [
'../public/javascripts/jquery-1.7.1.min.js',
],
done: function(errors, window) {
var $ = window.$;
// do some jquery magic and manipulate the dom
$('body').append('<div>foo</div>');
console.log('Freshly Manipulated HTML: '+ $('body').html()); // it logs perfectly
return $('body').html(); // this isn't returned to where I called tweakIt() from, why not?
}
});
}
var oldhtml = '<html><body><div>some text</div></body></html>';
var newhtml = tweakIt(oldhtml); // never gets set because nothing gets returned, why?
EDIT:
Это действительно была асинхронная проблема, поэтому вот как это следует сделать, используя обратный вызов вместо возврата:
function tweakIt(html_in, callback){
var jsdom = require('jsdom');
jsdom.env({
html: html_in,
scripts: [
'../public/javascripts/jquery-1.7.1.min.js',
],
done: function(errors, window) {
var $ = window.$;
// do some jquery magic and manipulate the dom
$('body').append('<div>foo</div>');
console.log('Freshly Manipulated HTML: '+ $('body').html()); // it logs perfectly
callback($('body').html()); // instead of a return, pass the results to the callback
}
});
}
var oldhtml = '<html><body><div>some text</div></body></html>';
var newhtml = tweakIt(oldhtml, function(newstuff){
console.log(newstuff); // woohoo! it works!
});