如果您帮助我理解函数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秒内解决。
请求你的帮助:
为什么resolve
内的代码会立即执行?因为我认为延迟4000被忽略了,如果是,那么帮助我理解为什么?
function(){}
包装如何帮助阻止resolve()
不立即执行?
我将非常感谢您的帮助,感谢所有人的快乐编码!
答案 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)
您正在创建回调。