我试图在骑手的评估功能中使用promises。一个简单的例子:
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
我错过了什么吗?
答案 0 :(得分:2)
PhantomJS进出浏览器的通讯渠道非常有限。它必须基本上通过基于文本的路径发送所有内容,因此它必须序列化它发送的内容,并反序列化出来的内容。
您可以在浏览器的JS上下文中发送“in”函数,因为它只是将其转换为字符串。但是出来的东西不能成为一个承诺,因为你失去了缠绕它的整个物体。您只能返回标量值和原始对象。如果查看模块home page中提供的示例,将返回原始对象:
.evaluate( function(selector){
// Trimmed for clarity...
return {
height : $( selector ).height(),
width : $( selector ).width()
}
}, '.thumbimage')
Node-horseman确实有异步操作的模式,但是你必须调用一个done()
函数,而不是返回一个承诺,你要求它作为你函数的一个参数:
.evaluate(function(ms, done){
var start = Date.now();
setTimeout(function() {
done(null, Date.now() - start);
}, ms);
}, 100)
evaluate()
的返回值已经是一个承诺。您不需要返回自己的一个。您只需要执行所需的任何异步工作,然后使用结果值调用done()
。