2017-07-02 100 views
3

我正在閱讀有關JavaScript承諾的文檔(https://developers.google.com/web/fundamentals/getting-started/primers/promises),其中一個示例使用了一系列承諾。何時執行Javascript承諾

// Start off with a promise that always resolves 
var sequence = Promise.resolve(); 

// Loop through our chapter urls 
story.chapterUrls.forEach(function(chapterUrl) { 
    // Add these actions to the end of the sequence 
    sequence = sequence.then(function() { 
    return getJSON(chapterUrl); 
    }).then(function(chapter) { 
    addHtmlToPage(chapter.html); 
    }); 
}) 

我很好奇它是如何工作的,因爲我認爲它會在第一個.then添加到承諾序列時開始執行代碼。當我調試代碼時,只有在腳本標記中執行了最後一行代碼之後,纔會執行承諾序列。所以我的問題是什麼時候承諾實際上被執行?謝謝。

+0

是您編寫完整腳本的腳本嗎?因爲那麼很明顯,那麼它就會在所有事情之後出現。 –

+0

檢查此:https://stackoverflow.com/questions/36870467/what-is-the-order-of-execution-in-javascript-promises –

回答

1

this post對承諾的執行上下文的一個很好的解釋:

所有。那麼()處理程序執行完畢的當前線程後,異步調用(如承諾/ A +規格說,當JS引擎返回到「平臺代碼」)。即使對Promise.resolve()。then(...)等同步解決的承諾也是如此。這是爲了編程一致性而完成的,因此不管承諾是立即還是以後解決,都始終一致地調用.then()處理程序。這可以防止一些定時錯誤,並使調用代碼更容易看到一致的異步執行。

+0

*「如果一個承諾已經解決,.then()回調函數在調用時立即執行。「*這是不正確的。 Promise.resolve()。then(()=> console.log(1)); console.log(2);' – Ryan

+1

@Ryan你是對的(我的一個誤解)。我做了更多的研究,並更新了我的答案。 – FrankerZ

+0

@FrankerZ這正是我所期待的。謝謝! – Wade73