2017-09-16 41 views
0

我有一個循環調用一個函數來解析一個承諾,我需要多次調用。當所有的通話都完成後,我想處理所有的承諾結果。建立一個承諾陣列不起作用,但單個承諾做

我有一個奇怪的情況,如果我把呼叫從循環中解放出來,Promise可以解決,我可以在Promise.all塊中處理它。 但是,如果我反覆調用該函數並將.push插入到數組中,我會得到一個正確大小的數組,但內部沒有對象。

這沒有環路的作品,我可以看到在geocodeResult對象數據:

var geocodePromise = geocodeRows(parsed.data[0]); 
Promise.all([geocodePromise]).then(function([geocodeResult]) { 
    console.log("IN PROMISE: " + beautify(geocodeResult, null, 2, 80)); 
}) 
.catch(function (error) { 
    console.log("Error: " + error); 
}) 
.catch(function() { 
    console.log("Error"); 
}); 

然而,隨着呼叫的循環:

var geocodeStack = []; 
for(j=0; j<parsed.data.length; j++){ 
    geocodeStack.push(geocodeRows(parsed.data[j])); 
} 
console.log(beautify(geocodeStack, null, 2, 80)); 

Promise.all([geocodeStack]).then(function([geocodeResult]) { 
    console.log("IN PROMISE: " + beautify(geocodeResult, null, 2, 80)); 
}) 
.catch(function (error) { 
    console.log("Error: " + error); 
}) 
.catch(function() { 
    console.log("Error"); 
}); 

控制檯輸出看起來是這樣的:

IN PROMISE: [ {}, {} ] 

誰能告訴我我做錯了什麼?

+0

爲什麼你創建了兩個'catch'回調?你不會在第一個「catch」回調中拋出錯誤,所以第二個不需要。 – alexmac

+0

此外,在第一個例子中,你不需要'Promise.all',只需使用'geocodePromise.then(...' – alexmac

+0

謝謝 - 這只是因爲代碼被刪除以便於閱讀。同意,我只是使用Promise.all都在這兩個例子中,所以它是可比較的。 –

回答

3

我認爲你需要Promise.all([...geocodeStack])Promise.all(geocodeStack)

你混合了兩種方法,得到Promise.all([geocodeStack]),它將一個數組數組傳遞給你的Promise.all,而不是一個Promise數組。

+1

只需添加到答案。關鍵是,'geocodeStack'已經是一個數組了,所以你不需要將它包裝在另一個數組中。 –

+0

@PatrickRoberts謝謝帕特里克。我在關於傳遞數組的陣列中添加了它 –

+0

非常感謝,我用這個撕掉了我的頭髮,當SO讓我時,我會在幾分鐘內接受你的答案。 –