承诺的节点骑士

我正在尝试使用骑士的评估function。 一个简单的例子:

var Horseman = require('node-horseman'); var horseman = new Horseman(); horseman .open('http://google.com') .evaluate(function() { var promise = new Promise(function(resolve,reject){ setTimeout(function(){resolve("Hello")},2000); }); return promise; }) .then(function(mesg){ console.log(mesg); }) .close(); 

我期待解决的价值“你好”被传递到下一个函数作为mesg参数当承诺履行,但相反,我得到以下错误:

 Unhandled rejection fn evaluate global code evaluateJavaScript@[native code] evaluate@phantomjs://platform/webpage.js:390:39 

我错过了什么吗?

PhantomJS具有非常有限的进出浏览器的通信通道。 它必须发送一切基本上基于文本的path,所以它必须序列化它发送什么,并反序列化出来的。

您可以发送一个函数在浏览器的JS上下文中执行,因为它只是将其转换为string。 但是,出来的东西不能成为承诺,因为你失去了包裹在它周围的整个东西。 您只能返回标量值和原始对象。 如果您查看模块主页中提供的示例,则会返回一个基本对象:

 .evaluate( function(selector){ // Trimmed for clarity... return { height : $( selector ).height(), width : $( selector ).width() } }, '.thumbimage') 

节点骑士确实有一个asynchronous操作的模式,但不是返回一个承诺,你必须调用done()函数,你要求作为参数给你的函数:

 .evaluate(function(ms, done){ var start = Date.now(); setTimeout(function() { done(null, Date.now() - start); }, ms); }, 100) 

evaluate()的返回值已经是一个承诺。 你不需要返回自己的一个。 你只需要做任何你想要的asynchronous工作,然后用你的结果值调用done()