node.js - 除了错误消息之外,您应该如何访问 Promise.allSettled() 对象数组中返回的堆栈跟踪?
问题描述
Promise.allSettled() 返回状态为已完成或已拒绝的对象数组以及原因,例如:'[{status: 'rejected', reason: 'Error: some error message}, ...]'
如果您 console.log 输出错误,您可以看到原因和堆栈跟踪。但是,当您将输出保存到日志文件时,您只会看到原因,而不是完整的堆栈跟踪。您还如何保存堆栈跟踪?
解决方案
原因给你错误信息。对于完整的堆栈跟踪,请使用 reason.stack,如下所示。这里的例子是批量处理大量的 Promise,以免内存不足,同时还保存了堆栈跟踪:
const fs = require('fs');
const batch = async myArr => {
const res = [];
for (let i = 0; i < myArr.length; i += 2) {
const requests = myArr.slice(i, i + 2).map(num => {
if (num % 2 === 0) {
return Promise.resolve(num);
}
if (num % 2 === 1) {
return Promise.reject(Error(`Rejected promise in for loop at num ${ num }`));
}
});
// eslint-disable-next-line no-await-in-loop
await Promise.allSettled(requests)
.then(response => res.push(response));
}
return res.flat();
};
batch([1, 2, 3, 4, 5, 6])
.then(res => {
let failed = [];
failed = res.filter(re => (re.status === 'rejected'));
for (let i = 0; i < failed.length; i += 1) {
fs.appendFileSync('reasons.txt', `${ failed[i].reason }\n`);
fs.appendFileSync('stack-traces.txt', `${ failed[i].reason.stack }\n`);
}
});
推荐阅读
- c - 无法在 Yocto Linux 操作系统上编译使用 json-c 库函数的代码
- gradle - 使用 gradle play 发布者上传发行说明
- android - 重启后未收到 Android 启动完成通知
- javascript - 当字符串包含表情符号时删除最后一个字符字符串
- intellij-idea - 有没有办法找到 PsiMethod 的所有覆盖?
- postgresql - Postgresql 在逻辑复制中跳过事务
- javascript - javascript中带有箭头的标记对象有什么不同?
- yocto - 添加对 systemd-udevd.service 的更改
- java - 在 java android 中使用 dagger2 在自定义/实用程序类中注入 AndroidInjection 的位置
- asp.net-mvc - tootltip 的数据绑定在 asp.net _knockout Web 应用程序中不起作用