繁体   English   中英

JavaScript 承诺中的隐式“解决”

[英]Implicit `resolve` in JavaScript promises

我在 JavaScript 中使用了带有setTimeout的承诺,我得到了一些神秘的行为。 我看到一切正常,我无法解释。

假设我有这个 function:

function f(callback) {
  setTimeout(() => callback(13), 3000);
}

当我在没有回调的情况下调用它时,我得到了一个最预期的错误:

> f()
undefined
> Uncaught TypeError: callback is not a function

当我使用实际回调调用它时,一切正常:

> f(console.log)
undefined
> 13

“问题”

到目前为止,一切都按计划进行,但是当我调用包装在 promise 中的f()时,似乎不再需要callback参数:

> new Promise(f).then(console.log)
Promise { <pending> }
> 13

慢一点,如果我存储 promise,它最终有一个值:

> p = new Promise(f)
Promise { <pending> }
> p
Promise { <pending> }
> p // after 3 seconds
Promise { 13 }
>

这发生在浏览器和节点上。

问题: f怎么可能根本不抱怨缺少callback 13如何分配为 promise 值?

TL;DR === false我知道我应该算我的祝福,因为它正在工作,但文档似乎没有提到任何隐藏的默认机制来处理我能找到的这种情况。 我得到的只是一个简短的介绍,然后是一个快速前进的路径,进入链接和更高级的模式。 我需要确保我可以在更复杂的情况下复制这种行为。

f 怎么可能根本不抱怨缺少回调?

您提供给 promise 的 function确实收到 arguments: resolvereject回调。

Promise 的正常使用如下所示:

return new Promise((resolve, reject) => {
  // call resolve() on success
  // call reject() on error
});

值 13 如何分配为 promise 值?

当您的超时到期时,您正在调用resolve(13)

让我们将 f 移至 promise 构造函数...

new Promise(function f(callback) {
  setTimeout(() => callback(13), 3000);
}).then(console.log)

然后让我们添加另一个参数...

new Promise(function f(callback, reject) {
  setTimeout(() => callback(13), 3000);
}).then(console.log)

并重命名回调以解决:

new Promise(function f(resolve, reject) {
  setTimeout(() => resolve(13), 3000);
}).then(console.log)

是不是很眼熟?

暂无
暂无

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

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