2017-07-31 61 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中。我怎樣才能將這三者連鎖/壓縮在一起,讓一個人在一個循環中運行,然後使用promise來運行func3?

乾杯。

+0

是你試圖按順序處理數組(所以你處理ar中的第一項並且在第一次完成之前不要開始處理第二個)?或者,您可以並行處理所有內容(一次運行所有內容),只要您知道何時完成所有事情?你的問題似乎表明了一點,你已經選擇了一個平行運行整個陣列的答案,我不確定這就是你實際要求的。 – jfriend00

+0

那麼實際上平行就可以了,它並不影響我在我當前的問題,但有沒有辦法做到這一點順序,即從索引0開始索引4(在我的情況)? – Neophile

+0

是的,有一種方法可以順序執行。這個問題必須是一個或另一個,所以人們可以單向回答。你已經接受了一個並行處理的答案。如果邏輯上並行並行,並且不會壓倒目標服務器(或觸發速率限制),那麼並行會更好,因爲完成所有操作通常更快。 – 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

@TheNewbie巴貝爾? –

+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"); 
    }); 
    } 
}