具有承诺的节点骑士

时间:2016-06-13 12:40:31

标签: javascript node.js promise phantomjs bluebird

我试图在骑手的评估功能中使用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

我错过了什么吗?

1 个答案:

答案 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()