2017-02-03 11 views
1

約束の二次元アレイ私は、別のグループの約束がその実行を完了した後、あるグループの約束を連鎖させたい。ノード:プロセスIは、約束の2次元アレイ(2 X n)を有し、そしてIは、行1のすべての約束を処理する第たいと他方に、次に行2内のすべての約束</p> <p>

どうすればこの問題を解決できますか?

私は以下を試みましたが、うまくいきませんでした。何か案は?

Promise.resolve() 
    .then(createPromises)//generates topPromises= [ [p1, p2, p3], [p4,p5,p6]] 
    .then(function(topPromises){ 
     Promise.all(topPromises[0]) 
     .then(Promise.all[topPromises[1]) 
    }) 
+0

最終的なデータ構造や出力は何ですか? – naomik

+0

最終的なデータ構造は実行の順序に依存します。例えば、ストア(p1〜p3の約束)がアイテム(p4〜p6を約束する)の前に追加されるはずのDBにデータを追加する。 – STiGMa

答えて

1

擬似再帰を使用してこれをプルすることができます。

本質的に、約束のグループを完成させる機能を持っています。完了したら、同じ機能をもう一度呼び出すが、次のグループで呼び出す。

let promiseCount = 1; 
 
function create() { 
 
    let n = promiseCount++; 
 
    return new Promise((resolve, reject) => { 
 
    setTimeout(() => { 
 
     console.log(n); 
 
     resolve(); 
 
    }, 500 * n); 
 
    }); 
 
} 
 

 
let groups = [ 
 
    [create(), create(), create()], 
 
    [create(), create(), create()], 
 
    [create(), create(), create()] 
 
]; 
 

 
(function runGroup(i) { 
 
    if (i < groups.length) { 
 
    Promise.all(groups[i]) 
 
     .then(() => { 
 
     console.log('Group', i + 1, 'complete'); 
 
     runGroup(i + 1); 
 
     }); 
 
    } 
 
})(0);

+0

ありがとう、これは私が達成しようとしていることです。 create関数内で他の約束が呼び出された場合、これは機能しますか? – STiGMa

+0

@STiGMa確かに問題はありません。 –

+1

助けてくれてありがとう。私はあなたの例に従って問題を解決しました。 – STiGMa

2

あなたはreturnを逃した、と私はあなたが必要な正確に何を知っているが、おそらくいないPromise代わりの.then年代の1

Promise.resolve() 
.then(createPromises)//generates topPromises= [ [p1, p2, p3], [p4,p5,p6]] 
.then(function(topPromises){ 
    return Promise.all(topPromises[0]) 
    .then(() => Promise.all[topPromises[1])) 
}) 

functionを渡しますあなたのコードは次のようになります:

cratePromises().reduce((topPromise, nestedPromises) => { 
    return topPromise.then(data => { 
    // data is empty array on first iteration and array of nestedPromises values on next iterations 
    return Promise.all(nestedPromises) 
    }) 
}, Promise.resolve([])) 
+0

ありがとう、私は例が不完全であることを知っています(簡単にするため)。あなたのコードの説明をお願いしますか?私はNodeについて多くの経験がありません。 – STiGMa

+0

@STiGMa実際、このコードはノード固有ではなく、単純なJavaScriptです。 私は約束のネストされた配列から約束チェーンを構築するために 'reduce'関数を使用しています。 それはそのよう.forEach'法あるいは '' for'オペレータに置き換えることができます。 'せtopPromise = Promise.resolve() cratePromises()のforEach(nestedPromises => { topPromise = topPromise逃したように私のサンプルコード 'の一部の愚かな誤差が')().then(データ=> { リターンPromise.all(nestedPromises) }) }) '' ' 申し訳ありませんが、存在した(おそらくまだ存在します'createPromises'の後 – Daniel

関連する問題