3

このフレームワークを使用して、いくつかの URL のスクリーンショットを作成しています。スクリーンショットを撮るプロセスは非同期であり、メソッドはコールバックを実行する方法を提供しません。このスクリプトで各スクリーンショットが作成されるときにコールバックを実行したいと思います。

nightmare = new Nightmare();
urls.forEach(function (url) {
    nightmare.goto(url).screenshot(path);
});

nightmare.run(function () {
  console.log('finished all');
});

どうすればこれを行うことができますか?

4

2 に答える 2

3

これがメソッドの目的のようrun()です。screenshot()このメソッドは phandomjs メソッドrender()に依存しており、render()厳密に同期しているため (少なくとも 1 年前の時点では) 、ループ内で各スクリーンショットをセットアップして実行することをお勧めします。

urls.forEach(function (url) {
    nightmare = new Nightmare();
    nightmare.goto(url).screenshot(path).run(function(err, nightmare) {
        console.log('this executes when your screenshot completes');
        // run() appropriately tears down the nightmare instance
    });
});

console.log('finished all');

一度にすべてのスクリーンショットを設定しても、非同期の利点は得られません。また、「finished all」は、すべてのスクリーンショットがレンダリングされた後にのみ実行されることが保証されています。

あるいは、nightmarejs のソースでは、コールバックのように見えるscreenshot() 2番目のdoneパラメーターを使用しているように見えますが、それを直接 phantomjsrender()メソッドに渡しています。上記のリンクに見られるように、そのメソッドが折り返し電話。

于 2014-10-16T17:22:41.347 に答える