第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

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

JS:我的 setTimeout 在閉包循環(huán)中出現(xiàn)問題

JS:我的 setTimeout 在閉包循環(huán)中出現(xiàn)問題

MM們 2023-11-02 17:28:59
我正在練習(xí)一些 Promise 和 Closure。我有一個forEach循環(huán),返回一個 3 秒超時的 Promise,在 Promise 解析后,它應(yīng)該記錄一條語句。我認(rèn)為我這樣做是錯誤的,因?yàn)槲移谕?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貢獻(xiàn)1818條經(jīng)驗(yàn) 獲得超8個贊

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


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


(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,因?yàn)?.forEach() 不適用于異步函數(shù)。我還將整個內(nèi)容包裝在 async?IIFE中,因?yàn)槟抢锊辉试S頂級等待 - 根據(jù)您放置此代碼的位置,您可能不必將其包裝在 async IIFE 中。

編輯

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

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

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")

? ? })

});


這基本上是在循環(huán)內(nèi)構(gòu)建一個承諾鏈。如果您“展開”循環(huán),它將如下所示:


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") })

因?yàn)槲覀儽A袅藢ψ詈笠粋€承諾的引用,并且我們不斷地附加到它的末尾,所以我們附加的每件新事情都會在最后一件事情完成后發(fā)生。


查看完整回答
反對 回復(fù) 2023-11-02
  • 1 回答
  • 0 關(guān)注
  • 187 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號