gpt4 book ai didi

javascript - 我们应该在 JavaScript 中选择 async await 而不是 Promise

转载 作者:IT老高 更新时间:2023-10-28 23:23:20 26 4
gpt4 key购买 nike

我知道 async await 是镇上新的 Promise 并且是编写异步代码的新方法,我也知道

我们不必编写.then,创建一个匿名函数来处理响应

Async/await 最终可以使用相同的构造处理同步和异步错误,好旧的 try/catch

promise 链返回的错误堆栈不提供错误发生位置的任何线索。但是,来自 async/await 的错误堆栈指向包含错误的函数

等等……

但是这里我做了一个简单的基准测试https://repl.it/repls/FormalAbandonedChimpanzee

在基准测试中,我已经运行了 2 个循环 100 万次。在第一个循环中,我正在调用一个返回 1 的函数在另一个函数中,我正在调用一个将 1 作为异常抛出的函数。

第一个循环调用返回 1 的函数所花费的时间几乎是抛出 1 作为错误的函数的一半。

这表明 throw 所用时间几乎是 return

所用时间的两倍
node v7.4 linux/amd64

return takes 1.233seconds
1000000
throw takes 2.128seconds
1000000

下面的基准代码

function f1() {
return 1;
}

function f2() {
throw 1;
}

function parseHrtimeToSeconds(hrtime) {
var seconds = (hrtime[0] + (hrtime[1] / 1e9)).toFixed(3);
return seconds;
}

var sum = 0;
var start = 0;
var i = 0;

start = process.hrtime();
for (i = 0; i < 1e6; i++) {
try {
sum += f1();
} catch (e) {
sum += e;
}
}
var seconds = parseHrtimeToSeconds(process.hrtime(start));
console.log('return takes ' + seconds + 'seconds');
console.log(sum);




sum = 0;
start = process.hrtime();
for (i = 0; i < 1e6; i++) {
try {
sum += f2();
} catch (e) {
sum += e;
}
}

seconds = parseHrtimeToSeconds(process.hrtime(start));
console.log('throw takes ' + seconds + 'seconds');
console.log(sum);

最佳答案

您的基准测试与 async/await 与原始 Promise 之间的性能无关。我所看到的是抛出错误需要更长的时间来计算。这是意料之中的。

回到主要问题,应该使用 async/await 而不是 .then 与原始 promise ?

请记住,async/await 只是原始 Promise 的语法糖,因此不会对整体性能产生太大影响。但是,它确实使您的代码更加线性,从而消除了开发人员的大量认知开销。

结论是使用你喜欢的。 Promise 可以被 polyfill,但新语法不能,因此在决定使用哪种样式时可能需要牢记这一点。


一些误会:

The error stack returned from a promise chain gives no clue of where the error happened

那不是真的。快速检查:

function error() {
return new Promise(function(res, rej) {
res(undefined()); // uh oh
});
}

error().then(console.log, e => console.log("Uh oh!", e.stack));

显示整个错误堆栈,包括位置。

关于javascript - 我们应该在 JavaScript 中选择 async await 而不是 Promise,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47524812/

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