2017-07-31 18 views
0

私は青い鳥を使用して約束にまで読んでいると、次のことを達成しようとしている:連鎖JavaScriptがループの中で約束 - ブルーバード

私はループまではfunc1とfunc2を実行する必要があります以上です。それが終わったら、func3を実行したいと思います。コードは以下の通りである:

注:すべての機能は、結果が戻される

var jsObj = ["1", "2", "3", "4", "5"]; // has 5 elements 

for (var i = 0; i < jsObj.length; i++) { 
var arr1 = []; 
arr1 = jsObj[i]; 
func1(arr1).then(function(returnVal1) { 
// finished func1 
func2(returnVal1).then(function(returnVal2) { 
// finished func2 
}); 
}); 
} // end of loop 

// Now, I need to run the last function once the loop is complete 
var data = ["1222"]; 
func3(data, function() { 
alert("all done"); 
}); 

関数func1とfunc2のが約束を使用して行われる(操作が正常に完了したことを示すために)コールバック関数を有していますコールバック関数の変数returnVal1とreturnVal2に格納されます。どのようにしてこれらの3つを連鎖/縮約してループ内で他のものを実行し、func3を約束だけで実行することができますか?

乾杯。

+0

ですが配列を順番に処理しようとしています(つまり、arの最初の項目を処理します最初の処理が完了するまで、2番目の処理を開始しないでください)。または、すべてが完了したときに知っている限り、すべてを並行して処理することでOKですか?あなたの質問は、両方のビットを示すようだとあなたは並列で配列全体を実行する答えを選択したと私はあなたが実際に何を求めているか分からなかった。 – jfriend00

+0

まあ実際には並行しても問題ありませんが、私の現在の質問には影響しませんが、インデックス0からインデックス4(私の場合)まで順番にこれを行う方法はありますか? – Neophile

+0

はい、それを順番に行う方法があります。この質問は、人々がそれを一方向に答えることができるように、一方または他方である必要があります。あなたはすでに物事を並行して行う答えを受け入れています。パラレルが論理的にOKで、ターゲットサーバを圧倒しない場合(またはトリガーレート制限がある場合)、パラレルはすべての処理を完了するのが通常より速いのでより優れています。 – jfriend00

答えて

2

その後、promise.allを使用し、約束にデータをマップします。

var jsObj = ["1", "2", "3", "4", "5"]; // has 5 elements 

var promises = jsObj.map(function(obj){ 
return func1(obj).then(function(value){ 
    return func2(value).then(function(val){ 
    return val; 
    }); 
}); 
}); 

Promise.all(promises).then(function(results){ 
alert("all done"); 
}); 

あなたが約束例えば、連鎖可能性があります

.then(a=>b(a)).then(b=>c) 

代わりの

.then(a=>b(a).then(b=>c)) 
+0

ES6は使用できません。 IE11もサポートする必要があります。 – Neophile

+0

@Newbie Babel? –

+0

もちろんできます。私にそれを試してみましょう。ありがとう。 – Neophile

0
var jsObj = ["1", "2", "3", "4", "5"]; // has 5 elements 

for (var i = 0; i < jsObj.length; i++) { 

    func1(jsObj[i]).then(function(returnVal1) { 
     // finished func1 
     func2(returnVal1).then(function(returnVal2) { 
     // finished func2 
      finalFn(); 
     }); 
    }); 
} // end of loop 

// Now, I need to run the last function once the loop is complete 
var count = 0; 
function finalFn(){ 
    count++; 
    if(count == jsObj.length){ 
    var data = ["1222"]; 
    func3(data, function() { 
     alert("all done"); 
    }); 
    } 
} 
関連する問題