2016-11-16 1 views
1

以下のJavascriptはNightmareJSを使用して3つの投稿をウェブサイトから検索し、投稿をアップロードしたユーザーのユーザー名を返すことを意図しています。何らかの理由でNightmareJSを使用しているときに複数のクエリを作成するにはどうすればよいですか?

var Nightmare = require('nightmare'); 
var nightmare = Nightmare({ show: true }); 

var inputArray = [198,199,201]; 


var runNext = function (i) { 

    nightmare 
    .goto('http://theshitpit.com/goto.php') 
    .insert('form [name=postnum]', i) 
    .click('form [type=submit]') 
    .wait() 
    .evaluate(function() { 
     return document.querySelector('.username').innerHTML 
    }) 
    .end() 
    .then(function (result) { 
    console.log(result) 
    }) 
    .catch(function (error) { 
     console.error('Search failed:', error); 
    }); 

} 


var index = 0; 

while(index<inputArray.length){ 
    runNext(inputArray[index]); 
    index++; 
} 

、コマンドプロンプトで実行する場合、このコードは次のように出力します

Search failed {} 
Search failed {} 

私は、これが動作しない理由を理解するために苦労してきました。私はrunNext(inputArray[0])を使用して特定の投稿のために1回だけ実行するために、このコードを(whileループなしで)使ってみましたが、これはうまくいきます。ですから、複数の投稿についての情報を得るためにwhileループを追加しようとすると、なぜそれは機能しませんか?

答えて

1

ナイトメアは非同期です。エラーは、前回の検索が完了するのを待つことなく、一度にループでrunNextを3回呼び出すために発生します。

したがって、最初の2回の検索は開始直後に開始され、最後の2回の検索は完了までに時間があります。

は、以前のものの終わりに次の検索を起動してください:

var Nightmare = require('nightmare'); 
var nightmare = Nightmare({ show: true }); 

var inputArray = [198, 199, 201]; 

var index = 0; 
var runNext = function (i) { 

    nightmare 
    .goto('http://theshitpit.com/goto.php') 
    .insert('form [name=postnum]', inputArray[i]) 
    .click('form [type=submit]') 
    .wait() 
    .evaluate(function() { 
     return document.querySelector('.username').innerHTML 
    }) 
    .then(function (result) { 
     console.log(result); 
    }) 
    .then(function(){ 
     index++; 

     // We will only run bext search when we successfully got here 
     if(index < inputArray.length){ 
      runNext(index); 
     } else { 
      console.log("End"); 
      nightmare.halt(); 
     } 
    }) 
    .catch(function (error) { 
     console.error('Search failed:', error); 
    }); 

} 

runNext(index); 
+0

こんにちは、あなたの助けに感謝します。私はこのように動作するように自分のコードを更新しましたが、チェックされた最初の投稿のユーザ名 - 1つのユーザ名だけが返されます。どんな考え? –

+0

申し訳ありません、前にナイトメアで働いたことがない、編集するためにドキュメントをチェックしなければなりませんでした。試して、働いている更新された答えを見てください。 '.end()'メソッドはプロセスをシャットダウンするためのもので、削除する必要があると思われます。別のメソッド '.halt()'が最後に終了するように追加されました。 – Vaviloff

関連する問題