搜尋

首頁  >  問答  >  主體

javascript - 關於setTimeout 與 Promise 的疑惑

對於 setTimeout(resolve('World'), ms);setTimeout(resolve, ms, 'World'); 有何不同之處表示不明白。


function timeout(ms = 100) {

  /*1. 为何这种写法,立即返回数据而不是等到过了 ms 后才返回*/
  // return new Promise((resolve, reject) => {
  //   setTimeout(resolve('World'), ms);
  // });

  /*2. 为何这种写法,等到过了 ms 后才返回*/
  return new Promise((resolve, reject) => {
    setTimeout(resolve, ms, 'World');
  });
}

timeout(1000)
  .then(value => {
    console.log(`Hello, ${value}`);
  })
  .catch(err => {
    console.error(err);
  });
代言代言2714 天前822

全部回覆(5)我來回復

  • 習慣沉默

    習慣沉默2017-06-12 09:23:50

    就是func()和func的差別,setTimeout的第一個參數是func,如果用func()相當於其回傳值為第一個參數。
    舉例:

    function test(){
        console.log('this is test!');
        return function () {
            console.log('this is return!');
        }
    }
    
    setTimeout(test(), 1000);

    大致相當於:

    console.log('this is test!');
    setTimeout(function () {
            console.log('this is return!');
        }, 1000);

    回覆
    0
  • 三叔

    三叔2017-06-12 09:23:50

    第一個傳的參數是立即執行的,不是函數名稱

    回覆
    0
  • 淡淡烟草味

    淡淡烟草味2017-06-12 09:23:50

    Promise無關,當你執行到setTimeout(resolve('World'), ms);時,瀏覽器就已經自動執行了resolve('World'),舉個例子:

    var test = function(value){
                console.log(value);
            }
            setTimeout(test('hello') , 2000);

    此時test立即執行。

    回覆
    0
  • 曾经蜡笔没有小新

    曾经蜡笔没有小新2017-06-12 09:23:50

    setTimeout 的第一個參數要求是一個函數

    一個函數

    一個函數

    (為什麼總有這麼多人不懂)

    setTimeout(resolve, ms, 'World'); 其中resolve 是一個函數,因此這段的行為正常
    setTimeout(resolve('World'), ms); ) 不是函數,是什麼決定於resolve 的回傳值類型,但無論如何,resolve註冊timer 的時候 就已經執行了,自然也就沒有延遲效果了註冊timer 的時候 就已經執行了,自然也就沒有延遲效果了

    回覆
    0
  • 巴扎黑

    巴扎黑2017-06-12 09:23:50

    ====================================
    以下答案作廢:沒仔細審題。 。
    大致沒什麼不同。

    只是! ! ! !

    IE瀏覽器對setTimeout(resolve, ms, 'World')的支援性有問題。 (貌似是IE <= 9 都會出問題)

    參考資料:(看裡面黃色背景的Note)

    WindowOrWorkerGlobalScope.setTimeout()

    回覆
    0
  • 取消回覆