2016-06-13 4 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コンテキスト内で実行される関数を、文字列に変換するだけなので、 "in"関数を送信できます。しかし、出てくるものは、その周りに包まれた物体全体を失うので、約束になることはできません。スカラ値とプリミティブオブジェクトのみを返すことができます。あなたはモジュールのhome pageで提供されている例を見ると、プリミティブオブジェクトが返されます。

.evaluate(function(selector){ 
    // Trimmed for clarity... 
    return { 
    height : $(selector).height(), 
    width : $(selector).width() 
    } 
}, '.thumbimage') 

ノード騎手は、非同期操作のためのパターンを持っているが、その代わりに約束を返すあなたdone()関数を呼び出す必要がありますあなたの関数へのparamとして与えられることを頼む:

.evaluate(function(ms, done){ 
    var start = Date.now(); 
    setTimeout(function() { 
     done(null, Date.now() - start); 
    }, ms); 
}, 100) 

evaluate()からの戻り値は、すでに約束です。自分のものを返す必要はありません。あなたは、あなたが望む非同期の仕事をして、結果値をdone()と呼ぶだけです。