2017-02-09 112 views
0

有人可以幫我理解爲什麼解決循環中的承諾只在我訪問循環變量時才起作用?例如,該記錄5次:解決循環中的承諾

for (let i = 0; i < 5; i++) { 
    this.getData() 
     .then(() => console.log("gotData " + i)); 
} 

但這只是記錄一次:

for (let i = 0; i < 5; i++) { 
    this.getData() 
     .then(() => console.log("gotData")); 
} 

時的getData()定義爲:

private getData(): Promise<void> { 
    return Promise.resolve(); 
} 

什麼是正確的方式來處理承諾循環?

+0

我認爲這是錯誤(可能是關於循環優化)。 (++ i <5)'時,我只是想知道它是如何工作的,如果用'while'重寫'for'循環' – oklas

+2

看看你的控制檯。你在輸出的最右側看到一個「5」嗎?如果相等,瀏覽器控制檯會將多個輸出摺疊爲一個。當然,如果文本不同,它就不能這樣做。 – Matthias247

回答

1

由於Matthias已經說過,瀏覽器的收縮控制檯輸出是相同的並且顯示一個計數指標。代碼的行爲完全相同。總之:


如果你想解決順序Promise是你必須做這樣的事情:

[1,2,3,4,5].reduce(
 
    (acc, i) => { 
 
    acc.then(() => console.log(i)); 
 
    return acc; 
 
    }, 
 
    Promise.resolve() 
 
);

如果訂貨不要緊,你可以使用Promise.all。如果您想要了解更多有關該主題的信息,只需搜索StackOverflow。有很多;)

+0

我認爲這可能是Chrome中的一個錯誤。我意識到將相同日誌分組的功能,但在這種情況下不會發生 - 在其他情況下它不會發生。在Firefox中測試過,並且工作正常。 – moldstadt

+0

謝謝。指出我在正確的方向。 – moldstadt