首页  >  问答  >  正文

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);
  });
代言代言2665 天前786

全部回复(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('World') 不是函数,是什么决定于 resolve 的返回值类型,但无论如何,resolve注册 timer 的时候 就已经执行了,自然也就没有延迟效果了

    回复
    0
  • 巴扎黑

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

    ====================================
    以下答案作废:没仔细审题。。
    大致没什么不同之处。

    只是!!!!

    IE浏览器对setTimeout(resolve, ms, 'World')的支持性有问题。(貌似是IE <= 9 都会出问题)

    参考资料:(看里面黄色背景的Note)

    WindowOrWorkerGlobalScope.setTimeout()

    回复
    0
  • 取消回复