gpt4 book ai didi

javascript - 为什么我们应该将 await 包装在异步函数中?

转载 作者:行者123 更新时间:2023-11-30 19:29:17 26 4
gpt4 key购买 nike

为什么要使用异步函数才能使用 await?为什么我们不能只使用 await 而不使用 async? JS 默认也是异步的,这只会增加困惑。

更新:我看到一些小伙子搁置了我的问题,所以我会尝试详细说明。我只是好奇为什么这行不通:

some code
let users = await getUsers();
some code

为什么它应该在异步中才能工作,即

$(async function() {
some code
let users = await getUsers();
some code
});

最佳答案

JS is async by default too...

不,默认情况下 JavaScript 不是异步的。 JavaScript 的唯一异步特性是相当新添加的:

  • promise 决议
  • async/await

JavaScript 通常用于您与异步事物交互的环境(例如 DOM 中的事件处理程序,或 Node.js 中的 I/O 完成),但 JavaScript 不是异步的(上述情况除外)。

在多年担任 ECMAScript 规范编辑的 the words of Allen Wirfs-Brock 中,JavaScript...

(has) an observably synchronous execution model. Other than via Atomics/SABs there are no observable shared-state race conditions.

回到你的问题:

Why should we have an async function in order to use await?

不久之后,一旦 top level await proposal 完成 process 的工作,您就不必再使用模块了。它刚刚进入第 3 阶段。

但答案是 await 是消费 promise 的语法糖, promise 的规则之一是您要么处理错误,要么将链返回给调用者(因此它可以处理错误或将链返回给它的调用者)。 await 不处理错误,因此它必须将链返回给调用者。它这样做的方式是 async 函数总是返回一个 promise,并且该 promise 链接到 await 等待的 promise。

也就是这个:

async function foo() {
const thingy = await somethingAsyncReturningAPromise();
return thingy.foo;
}

概念上的(但不是字面上的):

function foo() {
return somethingAsyncReturningAPromise()
.then(thingy => thingy.foo);
}

如果 somethingAsyncReturningAPromise 出现问题,foo 返回的 promise 会被拒绝——错误会传播给调用者。

据我从顶层的 await 提案中可以看出,它只是允许模块顶层的未处理拒绝成为未处理的拒绝。所以就像这段代码会导致未处理的错误一样:

null.doSomething();

异步模块中的这段代码会导致未处理的拒绝:

await somethingThatReturnsAPromiseAndRejects();

关于javascript - 为什么我们应该将 await 包装在异步函数中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56601306/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com