有诺言的节点骑士
问题描述:
我试图使用骑马者内的承诺evalute函数。一个简单的例子:有诺言的节点骑士
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
[email protected][native code]
[email protected]://platform/webpage.js:390:39
我错过了什么吗?
答
PhantomJS进出浏览器的通信通道非常有限。它必须将所有内容基本上发送到基于文本的路径,因此它必须序列化它发送的内容,并反序列化出现的内容。
您可以发送一个函数在浏览器的JS上下文中执行,因为它只是将其转换为字符串。但是出来的东西不可能是一个承诺,因为你失去了围绕它的整个物体。您只能返回标量值和原始对象。如果你看一下在模块的home page提供的示例中,返回原始的对象:
.evaluate(function(selector){
// Trimmed for clarity...
return {
height : $(selector).height(),
width : $(selector).width()
}
}, '.thumbimage')
节点骑手确实有异步操作的模式,但不是返回一个承诺,你必须调用一个done()
功能,你要求作为您的功能的参数:
.evaluate(function(ms, done){
var start = Date.now();
setTimeout(function() {
done(null, Date.now() - start);
}, ms);
}, 100)
从evaluate()
的返回值已经是一个承诺。你不需要返回你自己的。你只需要做任何你想要的异步工作,然后用你的结果值调用done()
。