好奇setTimeout()函数的工作原理

时间:2017-10-07 11:48:20

标签: javascript settimeout

如果您帮助我理解函数setTimeout(),我将不胜感激。请参考以下代码:

function doLog() {
  console.log(111);
}

var promise = new Promise((resolve, reject) => {
  setTimeout(() => {
    resolve(doLog());
  }, 4000)
});

promise.then(() => {
  setTimeout(function(){
    console.log('DONE');
  }, 3000);
})

完美无缺;首先我在4秒内收到111消息,然后在第一条消息后3秒内收到DONE消息。现在我改变了这部分代码(在我的想法中,目的是缩短代码):

var promise = new Promise((resolve, reject) => {
  setTimeout(resolve(doLog()), 4000)
});

问题描述resolve内的代码会立即执行,而我预计会在4秒内解决。

请求你的帮助:

  1. 为什么resolve内的代码会立即执行?因为我认为延迟4000被忽略了,如果是,那么帮助我理解为什么?

  2. function(){}包装如何帮助阻止resolve()不立即执行?

  3. 我将非常感谢您的帮助,感谢所有人的快乐编码!

3 个答案:

答案 0 :(得分:1)

setTimeout(() => {
  resolve(doLog());
}, 4000)

以上代码表示"使用文本() => { resolve(doLog()) }创建一个函数,并将其传递给setTimeout,这样我的新函数就可以在4秒内运行。运行时,调用doLog,并将其结果传递给resolve。

setTimeout(resolve(doLog()), 4000)

上述代码表示"立即调用doLog(),并将其结果传递给resolve。将resolve的结果传递给setTimeout,这样,如果resolve()的结果恰好是一个函数,那么该函数可以在4秒内运行"实际上,resolve()的返回值是而不是一个函数,因此4秒后不会发生任何事情。

答案 1 :(得分:0)

在你的第二个代码片段中,你正在立即执行resolve函数,只将其返回值传递给timeout函数:它通常返回undefined而不是一个可调用的函数,所以{{1}无所事事。不好!您可以执行以下操作,这将在4秒后调用setTimeout函数,但您将无法传递参数:

resolve

因此,如果你需要传递参数,你必须将它包装在一个周围的函数中,以阻止它立即执行(只要两个大括号跟随当前范围中的函数名称就会发生这种情况):

setTimeout(resolve, 4000);

我上面给出的两个代码片段都将函数发送到setTimeout(() => { resolve(a, b, c); }, 4e3); // 4e3 === 4000 ,这些函数仅在4秒后调用。所以你通常会想要使用这两种方法中的一种。

但是,如果你要立即调用包装函数,你会遇到完全相同的问题(直接调用resolve并将setTimeout返回undefined,因为包装函数没有返回值,而不是以后可以调用的函数):

setTimeout

所以在将它传递给`setTimeout!

时不要调用你的函数

除非且仅在超时后返回您想要调用的另一个函数,否则如下所示:

setTimeout(() => { resolve(a, b, c); }(), 4e3);

答案 2 :(得分:0)

这是因为您在设置超时功能中立即调用了一个函数。如果您使用下面的代码,那么结果将在4秒后打印。

var promise = new Promise((resolve, reject) => {
  setTimeout(doLog, 4000)
});

注意:没有parens 它与function(){}

没有任何关系

当您打电话时:

setTimeout(resolve(doLog()), 4000)

你实际上正在调用函数本身,但当你调用时:

setTimeout(() => {
resolve(doLog());
 }, 4000)

您正在创建回调。