[英]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) );
您看到返回的是setTimeout
的timeoutID
,这是浏览器分配的一个数字,用于跟踪所有单独的setTimeout
调用。
你犯的错误在这里:
let f = Promise.resolve(setTimeout(() => Promise.resolve(15), 1000));
您正在创建一个Promise
,它使用Promise.resolve
立即解决,并使用setTimeout(() => Promise.resolve(15), 1000)
立即解决。 这可能是脚本中的第一个超时,这就是timeoutID
为1
的原因。
您希望 promise 用15
解决,而不是setTimeout[...]
。 为了达到您的目标,您应该做的是:
let f = new Promise(resolve => setTimeout(() => resolve(15), 1000));
也就是说,创建一个新的Promise
启动一个新的setTimeout
,它在 1000 毫秒后运行并解析包含Promise
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.