- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我知道 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/
我是一名优秀的程序员,十分优秀!