2017-07-21 7 views
0

私は決して(intentionaly!)javascriptで非同期関数で作業したことがありません。 配列の要素(つまりfor(let i=0;i<array.length;i++){do_Something_Async_here()})に非同期関数を使用してPARALLELで処理する必要がある代入を行う必要があります。javascriptで配列ループの非同期関数を作成しますか?

私はこの

unique.forEach(function (number, index) 
    { 
     setTimeout(populateResults(index,number), 0); 
    }); 
function populateResults(index,number) 
{ 
    alert("populating results: index:"+index+" number:"+number); 
    var jp; 
    for(var i=0;i<1000000;i++) 
    { 
     jp=Math.pow(2,100); 
    } 
    alert("results populated: index:"+index+" number:"+number); 
    return jp; 
} 

のように、私は実際に数とインデックスを持つ何かをこの

let promises = []; 
for (var i=0;i<unique.length;i++) { 
    promises.push(populateResults(i,unique[i])); 
} 

Promise.all(promises).then(function(results){ 
    console.log(results); 
}).catch(function(err) { 
    // handle error here 
}); 

ようにsetTimeoutを使って試してみましたが、私はここでそれを簡略化してきました。 今、コードを実行すると、どちらの場合でも、私は通常Cまたはjavaでコードを実行しているようです。逐次的に。私は何が欠けていますか?それらを並行して実行するには? ありがとうございます。

+0

'populateResults'は非同期関数ではありません。普通の関数なので、名前には約束が含まれていないにもかかわらず' promises'にプッシュする前に完全に実行されます。 'Promise'を返す実際の非同期関数でもう一度やり直してください。別の結果が出るかもしれません。 – Duncan

+0

閉鎖を試みましたか?例:https://jsfiddle.net/8n00zre7/ – Kirill

+0

SimpleJの答えを見てくださいhttps://stackoverflow.com/questions/24924038/iterate-over-array-running-async-task-on-each-element彼は ' setTimeout() ' –

答えて

0

Javascriptの非同期関数は、すぐにPromiseを返し、将来のある時点で実行を完了するものです。

CやJavaとは異なり、Javascriptはシングルスレッドのみであるため、別のスレッドで実行される非同期関数と間違えてはいけません。コードはすべて同じスレッドで実行されるため完全に逐次的に実行されます。非同期のjavascript関数でできることは、しばらくするまで作業を遅らせることだけです。

つまり、非同期関数は、リモートデータをフェッチしたり、タイムアウトしたり、ユーザーからのイベントを待ってから続行するコードに役立ちます。

あなたはsetTimeoutを使用して、ここで非同期関数をシミュレートすることができます:

function delayedPopulateResults(index, number) { 
    return new Promise(function(resolve) { 
     setTimeout(function() { resolve(populateResults(index, number); }, 
      Math.random()); 
    }); 
} 

今、あなたはdelayedPopulateResults代わりのpopulateResultsを呼び出す場合、コードの2番目のブロックは、すべての約束を作成し、完成したときに、結果をログに記録します。しかし、コードが実行される前にランダムな遅延が導入されていることを覚えておいてください。populateResults()への呼び出しはランダムな順序で実行されますが、それぞれ次の呼び出しが実行される前に完了する必要があります。

あなたはECMAScriptの(ES7)の最新バージョンを使用することができるなら、あなたはこれを簡素化するためにasyncawaitキーワードを使用することができますが、お使いのブラウザでコードを実行するために、あなたはおそらく、このようなバベルや活字体へとtranspilerを使用する必要がありますES5でコードをレンダリングします。

関連する問題