繁体   English   中英

Promise.resolve() 在 setTimeout() 中返回一个奇怪的结果

[英]Promise.resolve() returns a weird result when in setTimeout()

1.

let f = Promise.resolve(15);
console.log(f);

f.then(v => console.log(v));

结果:

[object Promise] { ... }
15

一切都像想象的那样完美运行......但是当我将它插入 setTimeout() function 时,我无法解释为什么结果是1 ...

2.

let f = Promise.resolve(setTimeout(() => Promise.resolve(15), 1000));
console.log(f);

f.then(v => console.log(v));

结果:

[object Promise] { ... }

1

谢谢!

setTimeout对您传递的回调 function 的返回值没有任何作用。 将已解决的 promise 放在那里完全无关紧要。

外部 promise 的解析值是setTimeout的返回值。

返回的 timeoutID 是一个正的 integer 值,它标识调用 setTimeout() 创建的计时器; 可以将此值传递给 clearTimeout() 以取消超时。

MDN


如果您想在一段时间后解析 promise,请使用普通的 promise 构造函数。

 const promise = new Promise( (res) => { const resolve = () => res(15); setTimeout(resolve, 1000); } ); promise.then( value => console.log(value) );

您看到返回的是setTimeouttimeoutID ,这是浏览器分配的一个数字,用于跟踪所有单独的setTimeout调用。

你犯的错误在这里:

let f = Promise.resolve(setTimeout(() => Promise.resolve(15), 1000));

您正在创建一个Promise ,它使用Promise.resolve立即解决,并使用setTimeout(() => Promise.resolve(15), 1000)立即解决。 这可能是脚本中的第一个超时,这就是timeoutID1的原因。

您希望 promise 用15解决,而不是setTimeout[...] 为了达到您的目标,您应该做的是:

let f = new Promise(resolve => setTimeout(() => resolve(15), 1000));

也就是说,创建一个新的Promise启动一个新的setTimeout ,它在 1000 毫秒后运行并解析包含Promise

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM