是否等待等待诺言般的对象?
据Mozilla,等待只待承诺:是否等待等待诺言般的对象?
[RV]返回承诺的解析值,或本身的价值,如果它不是一个承诺。
如果您等待非承诺,已解决的承诺将立即返回,并且不会等待。但是,以下代码正在等待,而不使用Chrome中的Promises & FF。
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();
根据该规范,应等待等待许状物体不属于承诺? (我试过看规格(从Mozilla的文章链接),但我无法理解。)
但是在我的例子中,返回了一个未解决的诺言,因为它等待另外1000毫秒。如果能解决,它会立即返回。那个页面意味着参数是按照原样返回的,所以在我的例子中它会返回'{then:func => obj.func = func}',而不是'57' - 请参阅这里的示例。 – wezten
await
将触发obj.then()
,这是造成这种行为。因为即使obj
不是承诺,也是可靠对象。
您有关于here的一些信息。
在你的情况下,它的作品,因为:
第一跳
-
obj
初始化 -
setTimeout()
被执行,其回调将在接下来的蜱 -
go()
声明被称为 -
go()
是执行d -
await
被触发内部go()
,其执行obj.then()
,分配解析功能,以obj.func
- 它使蜱在这里结束
其次剔
- 尚未解析
setTimeout()
回调执行,解决承诺通过obj.func()
与价值57
第三蜱
- 控制是回
go()
,结果57
记录
我写了,所以我明白它为什么有效。我的问题是,它是否在规范中说,如果它不是'Promise',或者这是浏览器执行的东西不在规范中,'await'应该检查'then'属性的对象吗? – wezten
主要问题是什么承诺为ES-transpiler /解释器,其执行等待操作。例如,您可以使用蓝鸟承诺,但默认配置下的babel将无法理解它。主要定义之一是'promise === Promise.resolve(promise)',但是编译时转译器无法看到它。 –
在实践中,最有可能的是,Promise是一些有意思的东西,这意味着再生器运行时的Promise,这被广泛用于实现。有关详细信息,请参阅https://babeljs.io/docs/plugins/transform-async-generator-functions/。 –
其实它使用的承诺,你就看不出来:-)顺便说一句,这些“承诺状物体”也被称为[* thenables *](https://stackoverflow.com/q/29435262/1048572)。 – Bergi