Как мне вернуть значение из простой функции jsdom?

Я использую 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?

РЕДАКТИРОВАТЬ:

Это действительно была асинхронная проблема, поэтому вот как это должно быть сделано с использованием обратного вызова вместо возврата:

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!
});
5
задан k00k 23 February 2012 в 19:14
поделиться