2016-06-13 71 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()