Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/38.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 如何从简单的jsdom函数返回值?_Node.js_Express_Jsdom - Fatal编程技术网

Node.js 如何从简单的jsdom函数返回值?

Node.js 如何从简单的jsdom函数返回值?,node.js,express,jsdom,Node.js,Express,Jsdom,我将jsdom与jquery一起使用,它工作得很好。然而,我正在尝试将代码模块化一点,这样我就不会重复我自己了,所以我用一些jsdom代码制作了一个基本函数,它接受了一些html(DOM),用jquery对其进行了调整,然后将其吐出来。但是,我无法返回结果并将其分配给调用变量。我可能没有返回正确的位置,但我只是没有看到明显的结果。我需要一点帮助 代码如下: function tweakIt(html_in){ var jsdom = require('jsdom'); jsdom.env

我将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\u-in){
var jsdom=require('jsdom');
jsdom.env({
html:html_in,
脚本:[
“../public/javascripts/jquery-1.7.1.min.js”,
],
完成:函数(错误,窗口){
var$=窗口。$;
//执行一些jquery魔术并操作dom
$('body')。追加('foo');
console.log('新操作的HTML:'+$('body').HTML());//它可以完美地记录
return$('body').html();//这不会返回到我调用tweakIt()的位置,为什么不呢?
}
});
}
var oldhtml='some text';
var newhtml=tweakIt(oldhtml);//永远不会被设置,因为没有返回,为什么?
编辑:

这确实是一个异步问题,因此下面介绍如何使用回调而不是返回:

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!
});
function-tweakIt(html\u-in,回调){
var jsdom=require('jsdom');
jsdom.env({
html:html_in,
脚本:[
“../public/javascripts/jquery-1.7.1.min.js”,
],
完成:函数(错误,窗口){
var$=窗口。$;
//执行一些jquery魔术并操作dom
$('body')。追加('foo');
console.log('新操作的HTML:'+$('body').HTML());//它可以完美地记录
回调($('body').html());//将结果传递给回调,而不是返回
}
});
}
var oldhtml='some text';
var newhtml=tweakIt(旧HTML,函数(newstuff){
console.log(newstuff);//呜呜!它能用!
});

我不认为您可以使用返回值来实现这一点,因为done:是一个异步函数。 尝试向tweakIt添加回调,并通过将其作为参数发送来获取新的html,例如


tweakIt(oldHtml,function(newHtml){/*在这里使用结果*/})

新版本的jsdomapi不再包含“done”回调选项

所以我写了一个“穷人的回调”,只有在DOM变量被设置之后才能访问它

函数getSomeDOMVar(回调){ const jsdom=require(“jsdom”); const{JSDOM}=JSDOM; constdom=newjsdom(` var result;//全局作用域,未定义的var,在节点作用域中可作为dom.window.result访问 函数doSomething(){ //你的密码在这里 } //然后将需要的数据分配回全局范围的var 结果=剂量测定(); `, { 运行脚本:“危险”, 资源:“可用” }); //可怜人的呼唤 函数waitForVar(){ if(typeof dom.window.result!=“未定义”){ cb(dom.window.result); } } setTimeout(waitForVar,1000); } getSomeDOMVar(函数(结果){ console.log(结果)
});好,但是如何将新的HTML发送到来自
done:
的回调?不管怎样,我已经解决了。我将编辑我的OP以显示应该如何完成。谢谢假设您在tweakIt函数
callback
中命名了第二个参数,那么您可以执行如下操作,而不是在done函数中指定return语句:
callback($('body').html())
Yep,我就是这么做的。再次感谢。噢,我忘了
dom.window
在节点和浏览器环境之间共享访问权限。谢谢