2017-07-07 28 views
2

私はNodeJS上で実行されているゲームのボットコードを作成していますが、この関数が想定しているのは、一連のベクトルをループして、各ベクトルに移動させることです。Javascript loop through array asynchronous

しかし、どのようなことが実際にやっている、それが出てspazzesと、配列内の最後のベクトルに走るので、同時にすべてのベクトルに実行するためのボットを語っている:

function digSchedule() { 
    var arrayLength = blocksToMine.length; 
    for (var i = 0; i < blocksToMine.length; i++) { 
     console.log(i); 
     scaffoldTo(blocksToMine[i]); 
    } 
    ... 
} 

機能scaffoldTo()ニーズボットがその機能を実行するのを待ってから、配列内の次の要素に対して実行しますが、どうやってそれを行うのか分かりません。

+0

こんにちは、こんにちは!よくフォーマットされた質問のサンプルコードで - それを愛して:) – Ben

+1

非同期Promiseを読む –

+0

**私はnodeJSでこれを実行しています**私はOP idkを編集できません –

答えて

0

これを達成するにはいくつかの方法があります。最初は、おそらく "次の関数呼び出し"(おそらくscaffoldTo())でコールバックを渡すことです。 .bind()を使用して、イテレーター・インデックスiを持つ参照を作成できます。

また、Promiseのループを設定することもできます。これは、約束が解決されると実行される.then()メソッドを定義しています。

最後に、async/awaitのパターンはPromisesと似ていますが、一部は明確になり、Hype Wars:https://hackernoon.com/6-reasons-why-javascripts-async-await-blows-promises-away-tutorial-c7ec10518dd9に勝っているようです。

コールバック(ソリューション1)は、どのバージョンのJSでも利用できます。一般に図書館で利用可能であり、ES6でのネイティブサポートがあります。 Async/awaitはES2017の提案(?)であり、一般的には十分にサポートされています。

+0

NodeJSを使用している投稿を編集できますか?私はそれを編集した後で編集することはできません。 –

+0

既に行っています。 – Ben

0

これはES2017のの良い使用例です。

は、次のことを試してください:

async function digSchedule() { 
    var arrayLength = blocksToMine.length; 
    for (var i = 0; i < blocksToMine.length; i++) { 
     console.log(i); 
     await scaffoldTo(blocksToMine[i]); 
    } 
    ... 
} 

ES2017は問題外である場合は、あなたの最良の選択がscaffoldToからの約束が解決された場合にのみ、再び自分自身を呼び出す再帰関数を作ることであろう。

+0

NodeJSに接続していますが、このエラーが発生します:SyntaxError:予期しないトークン機能 –

+4

非同期機能はES2017ではなくES6ですhttps://github.com/tc39/proposals/blob/master/finished-proposals.md – Delapouite

+0

ノード7.6.0以降が必要です。 – joews

0

これはあなたがこれで遊ぶことができる別の方法です。それはあなたがscaffoldTo機能を変更することができることを前提としないだけでなく、digSchedule

function digSchedule(i, callback) { 
    if(!i){ 
     i = 0; 
    } 
    if(i < blocksToMine.length){ 
     scaffoldTo(blocksToMine[i], digSchedule(i++, callback)); 
    } 
    else{ 
    callback(); 
    } 
} 

に必要なパラメータは、次にscaffoldToの内側にあなたがこの

function scaffoldTo(block, callback){ 
    //do what ever you need to have the bot go to the vector 
    //after bot goes to vector call callback 
    callback(); 
} 
のようなものが必要になりますが、この方法では、コールバックスタイルにもっと焦点を当てあなたはこのようなものでdigScheduleを呼び出す必要があり、それすべてを開始するために

は:

digSchedule({null or 0}, function(){ 
    console.log("finished visiting vectors"); 
}); 

これは、パターンfを変えませんあなたが持っているようなforループを使っているが、私はその目標を達成するための楽しい方法だと思います。

0

ベンの答えを使って私は自分が望むことをする方法を学ぶことができましたが、これはうまくいかないことも学びました。私は、機能自体に欲しいものを求めて、コードのサポートを行う必要がありました。ご支援ありがとうございます! :)