除了错误消息之外,您还应该如何访问从 Promise.allSettled() 返回的对象数组中的堆栈跟踪?
How should you access the stack trace returned in the array of objects from Promise.allSettled() in addition to the error message?
Promise.allSettled() returns 状态为已完成或已拒绝的对象及其原因的数组,例如:'[{status: 'rejected', reason: 'Error: some error message}, ...]'
如果您 console.log 错误输出,您可以看到原因和堆栈跟踪。但是,当您将输出保存到日志文件时,您只会看到原因,而不是完整的堆栈跟踪。您还如何保存堆栈跟踪?
原因给你错误信息。对于完整的堆栈跟踪,请使用 reason.stack,如下所示。这里的例子是批处理大量的承诺,以免 运行 内存不足,堆栈跟踪也被保存:
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`);
}
});
Promise.allSettled() returns 状态为已完成或已拒绝的对象及其原因的数组,例如:'[{status: 'rejected', reason: 'Error: some error message}, ...]'
如果您 console.log 错误输出,您可以看到原因和堆栈跟踪。但是,当您将输出保存到日志文件时,您只会看到原因,而不是完整的堆栈跟踪。您还如何保存堆栈跟踪?
原因给你错误信息。对于完整的堆栈跟踪,请使用 reason.stack,如下所示。这里的例子是批处理大量的承诺,以免 运行 内存不足,堆栈跟踪也被保存:
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`);
}
});