2017-07-18 83 views
4

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的文章链接),但我无法理解。)

+0

主要问题是什么承诺为ES-transpiler /解释器,其执行等待操作。例如,您可以使用蓝鸟承诺,但默认配置下的babel将无法理解它。主要定义之一是'promise === Promise.resolve(promise)',但是编译时转译器无法看到它。 –

+0

在实践中,最有可能的是,Promise是一些有意思的东西,这意味着再生器运行时的Promise,这被广泛用于实现。有关详细信息,请参阅https://babeljs.io/docs/plugins/transform-async-generator-functions/。 –

+0

其实它使用的承诺,你就看不出来:-)顺便说一句,这些“承诺状物体”也被称为[* thenables *](https://stackoverflow.com/q/29435262/1048572)。 – Bergi

回答

0

that same page

如果该值不是一个Promise,其转换价值一个解决Promise,并等待它。

该值将自动转换为已解析的Promise,然后等待。

+1

但是在我的例子中,返回了一个未解决的诺言,因为它等待另外1000毫秒。如果能解决,它会立即返回。那个页面意味着参数是按照原样返回的,所以在我的例子中它会返回'{then:func => obj.func = func}',而不是'57' - 请参阅这里的示例。 – wezten

1

await将触发obj.then(),这是造成这种行为。因为即使obj不是承诺,也是可靠对象

您有关于here的一些信息。

在你的情况下,它的作品,因为:

第一跳

  1. obj初始化
  2. setTimeout()被执行,其回调将在接下来的蜱
  3. go()声明被称为
  4. go()是执行d
  5. await被触发内部go(),其执行obj.then(),分配解析功能,以obj.func
  6. 它使蜱在这里结束

其次剔

  1. 尚未解析setTimeout()回调执行,解决承诺通过obj.func()与价值57

第三蜱

  1. 控制是回go(),结果57记录
+0

我写了,所以我明白它为什么有效。我的问题是,它是否在规范中说,如果它不是'Promise',或者这是浏览器执行的东西不在规范中,'await'应该检查'then'属性的对象吗? – wezten