为什么由“async”函数返回的代理会触发“.then()”?

9

我正在使用babel (env)编译代码,将其编译到ES5。

这是代码:

(async () => {
     const p = async () => {
          return new Proxy({}, {
               get: (target, property) => {
                    console.log(property);
               }
          })
     };

     const r = await p();// await calls .then on the result of p()
})();


1
这不是因为 await。如果调用了 p,就会发生这种情况。 - thefourtheye
1
@Pirix 你为什么想要避免它?这是 Promise 和异步函数的工作方式。你的代理的目的是什么? - Bergi
2
@Pirix 你认为异步函数如何知道你正在“返回”一个“异步/承诺”? - Bergi
@Bergi 使用 instanceof Promise。我没有在规范中看到任何异步函数必须在其返回值上调用.then()的地方。而且我看到await必须解析promise/async的结果/返回值。 所以它确实解析了结果,但是在其上调用了.then()。 - millsp
2
await 应该用于 thenable 上,对于其他东西使用 "await" 没有意义,因此您的函数需要始终返回一个 promise。调用 .then 是指 解析结果。不是 async 调用 .then,而是 await 为了获取已解析的值而这样做。 - Lennholm
显示剩余4条评论
1个回答

7

它实际上发生了两次。

为什么由async function返回的Proxy会触发.then()

async function调用的结果是一个Promise,该Promise通过对函数体求值返回值进行解析。解析一个Promise会检查解析值是否为thenable(“类似Promise的值”),这将导致Promise等待内部结果。(在您的情况下,在代理上访问.then不会返回函数,因此它不被视为thenable,而Promise会使用代理满足)。

为什么await会触发Proxy上的.then()

同上。 await不仅适用于Promise,还适用于任意值。为了确定它们的“promise-worthiness”,它运行完全相同的thenable检查-它使用所等待值解决Promise,然后等待Promise解决。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接