【发布时间】:2017-07-18 11:21:30
【问题描述】:
根据Mozilla,await 只等待 Promises:
[rv] 返回 promise 的解析值,如果不是 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();
根据规范,应该 await await 不是 Promises 的类似 Promise 的对象吗? (我尝试查看规格(链接自 Mozilla 文章),但我无法理解。)
【问题讨论】:
-
主要问题是什么是 ES-transpiler/interpretator 的 Promise,它执行 await 操作。例如,你可以使用 bluebird Promise,但默认配置中的 babel 不会理解它。主要定义之一是
promise === Promise.resolve(promise),但编译器在编译时看不到它。 -
实际上它确实使用了 Promise,你只是看不到它们 :-) 顺便说一句,那些“类似 Promise 的对象”也被称为 thenables。
-
@Bergi 你链接到的问题不相关,因为那是关于等待数字,而不是
thenables。我的问题是:在规范中等待thenables? -
@wezten 答案解释了每个等待值会发生什么,无论是承诺、数字还是 thenable。
Promise.resolve处理 thenables - 是的,它在规范中。 -
@Bergi 在那个答案中它在哪里谈论
thenables?所有答案都显示await obj == await Promise.resolve(obj),但我不知道Promise.resolve(obj)是否会按原样返回obj的已解决承诺,或者它是否检测到它具有then属性,并返回等待的未解决承诺用于调用传递给then的回调。
标签: javascript asynchronous async-await