亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

JS:我的 setTimeout 在閉包循環中出現問題

JS:我的 setTimeout 在閉包循環中出現問題

MM們 2023-11-02 17:28:59
我正在練習一些 Promise 和 Closure。我有一個forEach循環,返回一個 3 秒超時的 Promise,在 Promise 解析后,它應該記錄一條語句。我認為我這樣做是錯誤的,因為我期望每 3 秒看到一個日志,"111"然后是"222",但是我看到延遲了 3 秒,然后立即看到 3 個日志"111" "222"。let arr = [1,2,3];arr.forEach((x,i) => {  (function() {       return new Promise((resolve,reject) => {          setTimeout(() => {             console.log("111")             resolve(true)          }, 3000);       })  })()  .then(() => {console.log("222")})});
查看完整描述

1 回答

?
弒天下

TA貢獻1818條經驗 獲得超8個贊

您只是忘記告訴 javascript 在 for 循環的每次迭代之間“等待”超時。那么發生了什么,javascript 將運行 for 循環,同時安排三個超時,然后這三個超時全部立即消失。


如果您像這樣添加等待,那么它將按您的預期工作。


(async function() {

? let arr = [1, 2, 3];


? for (let x of arr) {

? ? await (function() { // <-- await added

? ? ? return new Promise((resolve, reject) => {

? ? ? ? setTimeout(() => {

? ? ? ? ? console.log("111")

? ? ? ? ? resolve(true)

? ? ? ? }, 3000);

? ? ? })


? ? })()

? ? .then(() => {

? ? ? console.log("222")

? ? })

? }

})()

我切換到 for-of,因為 .forEach() 不適用于異步函數。我還將整個內容包裝在 async?IIFE中,因為那里不允許頂級等待 - 根據您放置此代碼的位置,您可能不必將其包裝在 async IIFE 中。

編輯

剛剛意識到,您在原始問題中的任何地方都沒有使用異步/等待內容。我不知道你是否已經了解了它,但你不必知道它來解決這個特定的問題。

這是另一種無需異步/等待的方法。

let arr = [1, 2, 3];


let promise = Promise.resolve();


arr.forEach((x,i) => {

? promise = promise

? ? .then(function() {

? ? ? return new Promise((resolve, reject) => {

? ? ? ? setTimeout(() => {

? ? ? ? ? console.log("111")

? ? ? ? ? resolve(true)

? ? ? ? }, 3000);

? ? ? })

? ? })

? ? .then(() => {

? ? ? console.log("222")

? ? })

});


這基本上是在循環內構建一個承諾鏈。如果您“展開”循環,它將如下所示:


promise = Promise.resolve()


promise = promise

? .then(() => /* wait 3000 ms and log "111" */)

? .then(() => { console.log("222") })

? .then(() => /* wait 3000 ms and log "111" */)

? .then(() => { console.log("222") })

? .then(() => /* wait 3000 ms and log "111" */)

? .then(() => { console.log("222") })

因為我們保留了對最后一個承諾的引用,并且我們不斷地附加到它的末尾,所以我們附加的每件新事情都會在最后一件事情完成后發生。


查看完整回答
反對 回復 2023-11-02
  • 1 回答
  • 0 關注
  • 172 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號