首页 > 解决方案 > 除了错误消息之外,您应该如何访问 Promise.allSettled() 对象数组中返回的堆栈跟踪?

问题描述

Promise.allSettled() 返回状态为已完成或已拒绝的对象数组以及原因,例如:'[{status: 'rejected', reason: 'Error: some error message}, ...]'

如果您 console.log 输出错误,您可以看到原因和堆栈跟踪。但是,当您将输出保存到日志文件时,您只会看到原因,而不是完整的堆栈跟踪。您还如何保存堆栈跟踪?

标签: node.jses6-promise

解决方案


原因给你错误信息。对于完整的堆栈跟踪,请使用 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`);
        }
    });

推荐阅读