是等待等待类似承诺的对象吗?

时间:2017-07-18 11:21:31

标签: javascript asynchronous async-await

根据Mozilla,只等待Promise:

  

[rv]返回promise的已解析值,如果它不是Promise,则返回值本身。

如果等待非承诺,将立即退回已解决的承诺,并且不会等待。但是,以下代码等待而不使用Chrome中的Promise& 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();

根据规范,是否应该等待承诺类型的非Promise对象? (我尝试查看规范(从Mozilla文章链接),但我无法理解。)

2 个答案:

答案 0 :(得分:1)

来自that same page

  

如果该值不是Promise,则会将该值转换为已解析的Promise,并等待该值。

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

答案 1 :(得分:1)

await将触发obj.then(),并导致该行为。因为即使obj不是Promise,也是可用对象

您有关于here的一些信息。

在你的情况下,它起作用是因为:

首先勾选

  1. obj已初始化
  2. setTimeout()被执行,其回调将在下一个刻度中被调用
  3. 宣布
  4. go()
  5. 执行
  6. go()
  7. awaitgo()内触发,执行obj.then(),将解析功能分配给obj.func
  8. 尚未解决,所以勾选结束
  9. 第二次打勾

    1. setTimeout()回调已执行,通过值obj.func()的{​​{1}}解决承诺
    2. 第三次打勾

      1. 控件返回57,结果go()已记录