2016-07-07 6 views
0

時間を要する関数に各項目を渡したいと思います。 しかし、JS関数が非同期であるようです。 関数を順番に呼び出すにはどうすればよいですか? (前回の処理後に次の項目を機能させるために渡す)forループでJavaScript関数を順番に呼び出す方法は?

function main() { 
    for (var i = 0; i < n ; i++) { 
     doSomething(myArray[i]); 
    } 
} 

function doSomething(item) { 
    // do something take time 
} 

私の解決方法では関数を再帰的に呼び出しています。 しかし、私はこの問題を解決する別の方法があることを知りたいですか?ありがとう。あなたは以前に行われた後に機能するために次のアイテムを渡したい場合は

function main() { 
    doSomething(myArray, 0); 
} 

function doSomething(item, i) { 
    // do something take time 
    doSomething(myArray, i + 1); 
} 
+0

私が知る限り、for-cyclesとjavascriptでの関数呼び出しは同期的であるため、関数asyncを作成する別のものでなければなりません。たぶんそれは関数そのものの中にあるかもしれません。 –

+0

申し訳ありませんが、私のコードはnode.jsサーバー上で実行されています。なぜ関数は非同期ですか? – Aaron

+1

'myArray.forEach(doSomething)'が気になります。 – Malk

答えて

0

、あなたはそれはあなたが順序で呼び出される関数にすることができ、この

var Q = require('q'); 
var promise; 
main(); 
function main() { 
    promise = doSomethingPromise(0) 
    for (var i = 1; i < 10 ; i++) { 
     (function (i) { 
      promise = promise.then(function (res) { 
       return doSomethingPromise(res + ' ' + i) 
      }); 
     })(i) 

    } 
} 

function doSomethingPromise (item) { 
    var d = Q.defer(); 
     d.resolve(doSomething(item)); 
    return d.promise; 
} 

function doSomething(item) { 
    // do something take time 
    console.log('doSomething', item); 
    return item; 
} 

のように、約束を使用しようとすることができます。

+0

こんにちはchenkehxx、私はあなたの答えを試みました。しかし、アイテム[1]からアイテム[item.length-1]までのルックスは、Q.defer()の行に突き当たります。 – Aaron

+0

私はあなたのすべてのコードを見ることができますか?、私は私のコードを実行しないでください。それはちょうど擬似コードです。 – chenkehxx

+0

HI chenkenhxx、私のコードはあなたがここに書いたのとまったく同じです。 – Aaron

関連する問題