JavaScript 中的 thenables 介绍和使用
在 JavaScript 中, thenable 是一个具有 then()
功能 。 所有的 Promise 都是 thenable,但并不是所有的 thenable 都是 Promise。许多 Promise 模式,例如 链接 和 async/await ,都适用于任何 thenable。 例如,您可以在 Promise 链中使用 thenables:
// A thenable is an object with a `then()` function. The
// below thenable behaves like a promise that fulfills with
// the value `42` after 10ms.
const thenable = {
then: function(onFulfilled) {
setTimeout(() => onFulfilled(42), 10);
}
};
Promise.resolve().
then(() => thenable).
then(v => {
v; // 42
});
你也可以使用 thenables await
:
// A thenable is an object with a `then()` function. The
// below thenable behaves like a promise that fulfills with
// the value `42` after 10ms.
const thenable = {
then: function(onFulfilled) {
setTimeout(() => onFulfilled(42), 10);
}
};
const v = await thenable;
v; // 42
Thenables in the Wild
许多库实现 thenables 以启用异步/等待支持。
例如, Mongoose 查询 是 thenable,尽管它们也有 exec()
返回一个承诺的函数。 Superagent 是一个流行的 HTTP 客户端,它也使用 thenables。 然而,无论是 Mongoose 查询还是 Superagent 请求实际上都不是 Promise。
其他库直接使用 Promise。 例如, Axios 请求 在某种意义上是 Promise,它们是 instanceof Promise
。
您可以使用将任意 thenable 转换为 Promise Promise.resolve()
:
// A thenable is an object with a `then()` function. The
// below thenable behaves like a promise that fulfills with
// the value `42` after 10ms.
const thenable = {
then: function(onFulfilled) {
setTimeout(() => onFulfilled(42), 10);
}
};
const p = Promise.resolve(thenable);
p instanceof Promise; // true
const v = await p;
v; // 42
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
上一篇: 在 Vue 中显示模态弹窗
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论