javascript – Zweifel an setTimeout und Promise
代言
代言 2017-06-12 09:21:50
0
5
834

äußerte Verwirrung über den Unterschied zwischen 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);
  });
代言
代言

Antworte allen(5)
習慣沉默

就是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);
三叔

第一个传的参数是立即执行的,不是函数名

淡淡烟草味

Promise无关,当你执行到setTimeout(resolve('World'), ms);时,浏览器就已经自动执行了resolve('World'),举个例子来说:

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

此时test立即执行。

曾经蜡笔没有小新

setTimeout 的第一个参数要求是一个函数

一个函数

一个函数

(为什么总有这么多人不理解)

setTimeout(resolve, ms, 'World'); 其中 resolve 是一个函数,因此这段的行为正常
setTimeout(resolve('World'), ms); 其中 resolve('World') 不是函数,是什么决定于 resolve 的返回值类型,但无论如何,resolve注册 timer 的时候 就已经执行了,自然也就没有延迟效果了

巴扎黑

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

只是!!!!

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

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

WindowOrWorkerGlobalScope.setTimeout()

Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage