“返回等待”是否存在性能问题?

IT技术 javascript async-await
2021-01-12 02:55:37

我看到有一个eslint 规则no-return-await,用于禁止return await.

在规则的描述中,它声明了一个return awaitadd "extra time before the overarching Promise resolves or rejects"

但是,当我查看MDNasync函数文档时,“简单示例”显示了一个示例,其中return await没有说明为什么这可能是性能问题。

return awaiteslint 文档建议的实际性能问题吗?

如果是这样,如何?

1个回答

不,没有任何性能问题这只是一个不必要的额外操作。执行可能需要更长的时间,但应该几乎不会引起注意。它类似于return x+0而不是return x整数x或者更确切地说,完全等同于毫无意义的.then(x => x).

它不会造成实际伤害,但我认为它的风格很糟糕,并且表明作者没有完全理解 promise 和async/ await

但是,在一种情况下,它会产生重要影响:

try {
    …
    return await …;
} …

await确实抛出拒绝,并且在任何情况下都在执行catchfinally处理程序之前等待Promise解决一个平原return会忽略这一点。

IMO 将其与返回.then(x => x)进行比较有点苛刻。正如您所指出的,在 try/catch 中是必要的。它可能更像是.then((x) => x.data)vs .then(x => x.data)IE 在您有多个参数的情况下, x 周围的括号是必需的,否则它们是可选的。我认为这是与辩论相同的心态:保持一致还是最小化更好?
2021-03-11 02:55:37
@TigerBear 不,这并不苛刻 - 这正是那里发生的事情。写作return await …会很奇怪,就像await await …会很奇怪一样。它有效,但没用。
2021-03-16 02:55:37
FWIW,截至 ES2020 的变化,只要等待的Promise ( x) 是本机Promise(不是第 3 方 thenable),return await x;并且return x;try/catch之外现在以完全相同的方式处理。没有额外的异步周期。
2021-03-16 02:55:37
我不会称它为无用,因为正如您已经指出的那样,它有时会有用,这意味着它属于不同的类别。一致与最小。类似于箭头函数参数周围的括号
2021-04-02 02:55:37
@TigerBear 这是一个非常不同的结构,我并没有称之为无用,并且没有理由return await在不同的情况下始终如一地使用awaitin a tryblock 等价于.then(x => x, err => …)or.catch(err => …)并且显然不是毫无意义的。
2021-04-10 02:55:37