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

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

為什么這個promise最后一個打印結果是5?

為什么這個promise最后一個打印結果是5?

嗶嗶one 2019-03-14 13:12:50
打印出0~4我能想明白,為什么會最后一行打印的是5呢?5是什么時候傳入的const tasks = []; // 這里存放異步操作的 Promiseconst output = (i) => new Promise((resolve) => {    setTimeout(() => {        console.log(new Date, i);        resolve();    }, 1000 * i);});// 生成全部的異步操作for (var i = 0; i < 5; i++) {    tasks.push(output(i));}// 異步操作完成之后,輸出最后的 iPromise.all(tasks).then(() => {    setTimeout(() => {        console.log(new Date, i);    }, 1000);});
查看完整描述

4 回答

?
波斯汪

TA貢獻1811條經驗 獲得超4個贊

你打印的是全局變量i 而這個變量在for循環執行完后就是5了


查看完整回答
反對 回復 2019-03-17
?
繁星點點滴滴

TA貢獻1803條經驗 獲得超3個贊

i是全局變量,for循環最后一次,i++,盡管跳出了循環,但i變成了5,promise.all().then()里面那個setTimeout里打印了i,所以最后就變成了5


查看完整回答
反對 回復 2019-03-17
?
瀟湘沐

TA貢獻1816條經驗 獲得超6個贊

for循環和Promise.all作用域在同一級 所以i是5


查看完整回答
反對 回復 2019-03-17
?
喵喔喔

TA貢獻1735條經驗 獲得超5個贊

使用var聲明的變量是沒有局部作用域的概念,只有函數作用域。


    for (var i = 0; i < 5; i++) {

        tasks.push(output(i));

    }

    // 異步操作完成之后,輸出最后的 i

    Promise.all(tasks).then(() => {

        setTimeout(() => {

            console.log(new Date, i);

        }, 1000);

    });

這種寫法和下面的寫法是一樣的效果:


    var i = 0

    for (; i < 5; i++) {

        tasks.push(output(i));

    }

    // 異步操作完成之后,輸出最后的 i

    Promise.all(tasks).then(() => {

        setTimeout(() => {

            console.log(new Date, i);

        }, 1000);

    });

因為i是在最外層作用域的,而then中的回調是在所有promise都resolve之后才執行的,這是 i 已經被賦值為5,所以輸出5.

如果使用let聲明i,你就會看到報錯的情況


查看完整回答
反對 回復 2019-03-17
  • 4 回答
  • 0 關注
  • 641 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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