2015-09-15 18 views
7

をもたらすが、私はしない、ウェブサイト使用ES6構文なしNightmare.jsと

var Nightmare = require('nightmare'); 
var vo = require('vo'); 

vo(run)(function(err, result) { 
    if (err) throw err; 
}); 

function *run() { 
    var x = Date.now(); 
    var nightmare = Nightmare(); 
    var html = yield nightmare 
    .goto('http://google.com') 
    .evaluate(function() { 
     return document.getElementsByTagName('html')[0].innerHTML; 
    }); 

    console.log("done in " + (Date.now()-x) + "ms"); 
    console.log("result", html); 

    yield nightmare.end(); 
} 

私はノードの古いバージョンを使用した環境でこれを実行したいをこすりするnightmare.jsを使用して、簡単なノードのスクリプトを構築しましたES6機能をサポートします。 githubページには、 "yield"キーワードなしでこれを行う方法の例はありません。

私はここES6構文なしでの使用例を見つけた:Webscraping with nightmare

私はこのようにそれを書いた:

var night = new Nightmare() 
.goto('http://www.google.com') 
.evaluate(function() { 
    return document.getElementsByTagName('html')[0].innerHTML; 
},function (html) { 
    console.log("result", html); 
    } 
) 
.run(function (err, nightmare) { 
    if (err) return console.log(err); 
    console.log('Done!'); 
}); 

それはクラッシュしませんが、結果ロギング関数が呼び出されることはありません。

yieldの構文では、は「評価」から返された値を取得するのはかなり簡単ですがですが、それを実行する方法はありませんでした。

更新 これは受け入れられた回答とそのコメントに感謝しました。これは、「Q」を使用し、0.12以前のノードのバージョンで動作します。

var Nightmare = require('nightmare'); 

var Promise = require('q').Promise; 

var x = Date.now(); 
var nightmare = Nightmare(); 
Promise.resolve(nightmare 
    .goto('http://google.com') 
    .evaluate(function() { 
     return document.getElementsByTagName('html')[0].innerHTML; 
})).then(function(html) { 
    console.log("done in " + (Date.now()-x) + "ms"); 
    console.log("result", html); 
    return nightmare.end(); 
}).then(function(result) { 

}, function(err) { 
    console.error(err); // notice that `throw`ing in here doesn't work 
}); 
+1

https://babeljs.io/docs/usage/cli /#babel-node)は、使用例に応じて、より簡単な解決策になるかもしれません。基本的にはES6コードを実行する前にES6コードをES5に変換するラッパーです。 –

答えて

12

ドキュメントが恐ろしいですが、悪夢がthenablesに基づいているようです。とにかく、私はコールバックインターフェイスについて多くの情報を見つけられませんでしたが、それはとにかくインデントピラミッドにつながります。

約束を使用するのが最善の策ですが、おおよそES6標準に準拠するany libraryを選択するだけです(それらはすべて非ES6環境でも使用できます)。

あなたが簡単にリニア・ジェネレータ・コードは、ちょうどthen呼び出しによってすべてのyieldを置き換える、約束チェーンに変身することができます([バベルノード]を使用して

var Nightmare = require('nightmare'); 
var Promise = require('…'); 

var x = Date.now(); 
var nightmare = Nightmare(); 
Promise.resolve(nightmare 
    .goto('http://google.com') 
    .evaluate(function() { 
     return document.getElementsByTagName('html')[0].innerHTML; 
})).then(function(html) { 
    console.log("done in " + (Date.now()-x) + "ms"); 
    console.log("result", html); 
    return nightmare.end(); 
}).then(function(result) { 
    … 
}, function(err) { 
    console.error(err); // notice that `throw`ing in here doesn't work 
}); 
+0

この正確な例で使用したリストのライブラリはどれですか?私は成功していない "q"で試した。 – Rayjax

+0

ああ、 'Q'は従来の呼び出し規約を持っていた(これは初期のライブラリの1つだった)。 'Promise'の代わりに' 'Q.Promise''と' 'Promise.resolve''の代わりに' 'Q''を実行する必要があります。 – Bergi

+0

これで動作します:) – Rayjax

関連する問題