我有這段代碼:承諾解析順序伺機
af = async() => {
Promise.resolve()
.then(x => console.log("first then"))
.then(x => console.log("second then"))
await Promise.resolve()
console.log("after await")
}
af()
在谷歌的Chrome版本61.0.3163.91(正式版本)(64位) 當我運行它從一個<script>
,我得到了以下結果:
first then
after await
second then
但是當我複製/粘貼代碼到控制檯,並運行它有:
first then
second then
after await
node.js 8.5.0的行爲相似。
什麼是正確的順序和爲什麼有區別?
//編輯
另一個有趣的事情是,火狐55.0.2(64位) 此代碼:
af = async() => {
Promise.resolve()
.then(x => console.log("first then"))
.then(x => console.log("second then"))
.then(x => console.log("third then"))
.then(x => console.log("forth then"))
await Promise.resolve()
console.log("after await")
}
af()
日誌:
first then
second then
third then
after await
forth then
如果多個'。然後()'處理程序都在一個'await'後同時事項的隊列(和代碼的精確的順序是非常相同一個'.then()'處理程序),那麼你的代碼應該寫成你自己控制順序,而不是完全依賴於promise調度程序的命令。而且,我甚至不確定你問的是實際寫入規範。無論如何,大多數真正的實現都會有不確定時間的承諾背後的異步操作。 – jfriend00
準確而精確的答案很可能會非常長,並取決於未指定的實現細節。查看DOMContentLoaded的步驟,例如https://html.spec.whatwg.org/multipage/parsing.html#the-end –
不知道爲什麼,但它可能是一個提示: 如果您全部替換你用數組推動日誌,然後登錄你的最終陣列,訂單總是 ['1 then','2 then','await] 也許是一個console.log不一致的行爲? –