2017-07-02 74 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