2017-07-06 4 views
-1

配列を非同期的に反復しようとしていて、呼び出された関数の値を新しい配列にプッシュしたいとします。企業を返す/印刷するとき非同期に配列を反復処理して配列を返しますか?

私はもちろん

let companies = []; 
_.forEach(notProcessed, function(company) { 
    companies.push(processThem(company)); 
}); 
return companies; 

...次のコードを持っているが、これにアプローチする方法がないように注意してください、私は空の配列を受け取ります。

ありがとうございました。ありがとうございました。それをやっての

+1

'processThem()'に非同期コードがある場合、promise配列を作成する必要がありますが、promiseを配列にプッシュするために約束を返すには 'processThem()'が必要です。次にpromiseの配列に 'Promise.all()'を使います。 – charlietfl

+1

'processThem()'のサンプルコードを表示します。 – charlietfl

+0

'空の配列を受け取ります' - いいえ、あなたは 'notProcessed'配列の中の配列の値はすべて 'undefined 'であるか、' processThem'が返すものは –

答えて

0

一つの方法:

var notProcessed = ['a', 'b', 'c']; 

function processThem(company) { 
    // Example long process 
    return new Promise((resolve) => { 
    setTimeout(() => resolve(company), 500); 
    }); 
} 

function processArrayAsync(notProcessed) { 
    var companies = []; 
    var promise = Promise.resolve(); 
    for(let next of notProcessed) { 
    promise = promise 
     .then(() => processThem(next)) 
     .then(company => companies.push(company)); 
    } 

    return promise.then(() => companies); 
} 

processArrayAsync(notProcessed).then(console.log); 

そして、より良い方法はES6でasync機能

var notProcessed = ['a', 'b', 'c']; 

async function processThem(company) { 
    // Example long process 
    return new Promise((resolve) => { 
    setTimeout(() => resolve(company), 500); 
    }); 
} 

async function processArrayAsync(notProcessed) { 
    var companies = []; 
    for(let next of notProcessed) { 
    let res = await processThem(next); 
    companies.push(res); 
    } 
    return companies; 
} 

processArrayAsync(notProcessed).then(console.log); 

を新たに使用している私は本当に非同期操作を処理する。この第二の方法のように:)

関連する問題