javascript - await 是否等待类似 promise 的对象?

标签 javascript asynchronous async-await

<分区>

根据 Mozilla , await 只等待 Promises:

[rv] Returns the resolved value of the promise, or the value itself if it's not a Promise.

如果您等待非 Promise,将立即返回已解决的 Promise,并且不会等待。但是,以下代码在 Chrome 和 FF 中不使用 Promises 等待。

var obj = {
    then:func => obj.func=func
};
setTimeout(() => obj.func(57), 1000);

async function go() {
    var res = await obj;
    console.log(res); //shows '57' after 1000ms
}

go();

根据规范,是否应该等待不是 Promises 的类似 promise 的对象? (我试着查看规范(链接自 Mozilla 文章),但我无法理解。)

最佳答案

await 将触发 obj.then(),这会导致该行为。因为即使 obj 不是 Promise,也是一个 thenable 对象

你有一些关于那个的信息here .

在你的情况下它有效是因为:

第一次打勾

  1. obj 已初始化
  2. setTimeout()被执行,它的回调将在下一个tick被调用
  3. go() 声明
  4. go() 被执行
  5. awaitgo()内部触发,执行obj.then(),将解析函数赋值给obj。函数
  6. 还没有解决所以打勾在这里结束

第二次勾选

  1. setTimeout() 回调被执行,通过 obj.func() 解决 promise ,值为 57

第三个勾

  1. 控制返回到go(),记录结果57

关于javascript - await 是否等待类似 promise 的对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45165365/

相关文章:

javascript - addClass 到 wrapAll 结果

php - 从 JavaScript 运行 PHP 类

c# - 异步 SQL 查询执行 - Task.WaitAll(tasks) 永远不会完成

rust - Tokio 的简单 TCP 回显服务器示例(在 GitHub 和 API 引用上)有什么好的详细解释?

node.js - Puppeteer - Handlin page.waitForSelector() 失败

javascript - 从对象数组中删除对象

javascript - 何时在 javascript/jQuery 中使用 "$"

Node.JS + Mongoose 回调 hell

javascript - 如何使用 fetch() 用来自服务器的数据填充变量?

c# - 如何构建一个健壮/可扩展的异步等待回显服务器?