首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >节点骑士与承诺

节点骑士与承诺
EN

Stack Overflow用户
提问于 2016-06-13 12:40:30
回答 1查看 850关注 0票数 1

我试着在骑士的评估功能中使用承诺。一个简单的例子:

代码语言:javascript
运行
复制
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参数,但是我得到了以下错误:

代码语言:javascript
运行
复制
Unhandled rejection fn
evaluate

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

我是不是遗漏了什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-06-13 13:37:53

PhantomJS有一个非常有限的通信通道进出浏览器。它必须通过一个基于文本的路径发送所有东西,所以它必须序列化它发送的内容,并反序列化出的内容。

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

代码语言:javascript
运行
复制
.evaluate( function(selector){
  // Trimmed for clarity...
  return {
    height : $( selector ).height(),
    width : $( selector ).width()
  }
}, '.thumbimage')

节点-骑手确实有异步操作的模式,但与其返回承诺,还必须调用请求作为函数的param的done()函数:

代码语言:javascript
运行
复制
.evaluate(function(ms, done){
    var start = Date.now();
    setTimeout(function() {
        done(null, Date.now() - start);
    }, ms);
}, 100)

来自evaluate()的返回值已经是一个承诺。你不需要回你自己的。您只需要完成任何异步工作,然后使用结果值调用done()

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37790117

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档