現在、Windows ストアの JavaScript アプリケーションに取り組んでおり、非同期 for ループの実装に行き詰まっています。
次のような単純な for ループを考えてみましょう
for(i=0,i<4,i++)
{
//body
}
上記のコードと同じプロセスを実行できる正確な asyncFor ループは何でしょうか
現在、Windows ストアの JavaScript アプリケーションに取り組んでおり、非同期 for ループの実装に行き詰まっています。
次のような単純な for ループを考えてみましょう
for(i=0,i<4,i++)
{
//body
}
上記のコードと同じプロセスを実行できる正確な asyncFor ループは何でしょうか
通常、ループを再帰的にコーディングする必要があります。つまり、非同期コールバックから次の再帰ステップを呼び出します。
function loop(i, n, body, callback) {
if (i < n)
body(i, function cb() {
loop(i+1, n, body, callback);
});
else
callback();
}
次に、次のように使用します
loop(0, 4, function(i, cb) {
console.log(i);
setTimeout(cb, 50); // or whatever async task with callback you have
}, function() {
console.log("done everything");
});
You can use a recursive function callback
function test(){
myCall(function(){
alert("Hello world");
},5);
}
function myCall(callback , count){
if(count === 0){
return;
}else{
callback();
count--;
}
myCall(callback , count);
}
配列をループする場合は、これら 2 つのヘルパーが役立つ場合があります (より簡潔な表記のための CoffeeScript 構文)。モンキー パッチに抵抗がある場合は、気軽にスタンドアロン関数に変換してください。
# call function for each element in array
# returns when all promises have been completed
Array::eachAsync = (fn) ->
promises = @map (item, index, collection) -> fn(item, index, collection)
WinJS.Promise.join(promises)
# call function for each element in array in order
# returns when the last one has been processed
Array::sequentialEachAsync = (fn) ->
@reduce (lastPromise, item) ->
lastPromise.then () -> fn(item)
, WinJS.Promise.wrap()
あなたが正しいことを理解した場合にのみ...次のようなことを試すことができます:
function asyncFor(n, callback)
{
var i=0;
var t=setInterval(function(){
callback();
i++;
if(i==n)
clearInterval(t);
}, 0);
}
asyncFor(4, function(){
console.log('hello world');
});
console.log('after for');
そうでない場合-申し訳ありませんが、私の答えを無視してください
コールバック関数を使用します。
someFunction = function(data, ...){
someAsyncFn(someFunction); //use this function as the callback
}