我试着在骑士的评估功能中使用承诺。一个简单的例子:
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();
我期望将解析值"Hello“传递给下一个,然后在履行承诺时充当mesg参数,但是我得到了以下错误:
Unhandled rejection fn
evaluate
global code
evaluateJavaScript@[native code]
evaluate@phantomjs://platform/webpage.js:390:39
我是不是遗漏了什么?
发布于 2016-06-13 13:37:53
PhantomJS有一个非常有限的通信通道进出浏览器。它必须通过一个基于文本的路径发送所有东西,所以它必须序列化它发送的内容,并反序列化出的内容。
您可以在浏览器的JS上下文中发送要执行的"in“函数,因为它只是将其转换为字符串。但是出来的不可能是承诺,因为你失去了包裹在它周围的整个物体。只能返回标量值和原始对象。如果查看模块的主页中提供的示例,将返回一个基本对象:
.evaluate( function(selector){
// Trimmed for clarity...
return {
height : $( selector ).height(),
width : $( selector ).width()
}
}, '.thumbimage')
节点-骑手确实有异步操作的模式,但与其返回承诺,还必须调用请求作为函数的param的done()
函数:
.evaluate(function(ms, done){
var start = Date.now();
setTimeout(function() {
done(null, Date.now() - start);
}, ms);
}, 100)
来自evaluate()
的返回值已经是一个承诺。你不需要回你自己的。您只需要完成任何异步工作,然后使用结果值调用done()
。
https://stackoverflow.com/questions/37790117
复制相似问题