2016-06-13 68 views
1

我试图使用骑马者内的承诺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 

我错过了什么吗?

回答

2

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