gpt4 book ai didi

javascript - 在 Array#map 中处理异步/等待中的错误(拒绝)

转载 作者:搜寻专家 更新时间:2023-11-01 00:29:04 25 4
gpt4 key购买 nike

Node 8.1.2,我有一个结构,其中一个文件在映射中调用另一个文件的函数。在一个真实的例子中,我会在 map 上使用 Promise.all 但这不是这里的问题。这是结构:

A.js:

const { b } = require('./B')

function expressStuff (req, res, next) {
things.map(thing => {
return b(thing)
}))

return res.status(200).json(...)
}

B.js:

// Thing -> Promise<Object>
function b (thing) {
return ThingModel.update(...) // this returns a Promise but FAILS and throws an errror
}

module.exports = { b }

好的。所以在函数 b 中,我尝试获取一些异步数据(来自数据库)。它失败并抛出一个 Uncaught Promise Rejection。

如何应对?

我尝试了多种解决方案:

A1.js:

const { b } = require('./B')

function expressStuff (req, res, next) {
things.map(thing => {
try {
return b(thing)
} catch (err) {
return next(err)
}
}))

return res.status(200).json(...)
}

但这仍然没有被捕获。

A2.js:

const { b } = require('./B')

function expressStuff (req, res, next) {

try {
things.map(thing => {
return b(thing)
}))
} catch (err) {
return next(err)
}

return res.status(200).json(...)
}

仍未处理。我尝试使用 Promise.all,我尝试了两个 try-catch block (因为我认为 map 中的那个可能会从 to 返回 next map 结果,而不是 expressStuff 函数的结果。仍然没有。

我得到的答案是处理错误,但随后代码不会等待它被抛出,res.status()next 都会工作导致竞争条件和 发送后无法设置 header 错误。

我想要做的就是让函数 b 抛出一个错误,但在 expressStuff 中捕获它,这样我就可以重新抛出自定义 UnprocessableEntityError并将其传递给 next。似乎来自文件 B 的错误没有冒泡到调用它的 map

我该怎么做?

编辑:

处理此拒绝的唯一方法是尝试在 B.js 中捕获它。但是,如果我尝试重新抛出一个错误/返回它——什么也没有。错误被吞噬了。如果我尝试 console.log 它 - 它会被记录下来。

详情:

感谢标记答案,我重构了我的实际代码并使其完美运行。

function expressStuff (res, req, next) {
try {
await Promise.all(things.map(async thing => {
if (ifSomething()) {
await b(thing)
}
}))
} catch (err) {
return next(new MyCustomError('My Custom Error Message'))
}

return res.status(200).json(...)
}

最佳答案

使用 try/catch 处理拒绝仅在 async function 中有效,当您 await promise 时 - 这你还没有尝试过。

你可以做任何一个

async function expressStuff (req, res, next) {
var results;
try {
results = await Promise.all(things.map(b)); // throws when any of the promises reject
} catch (err) {
return next(err) // handle error
}
return res.status(200).json(...)
}

或(如 Wait until all ES6 promises complete, even rejected promises )

function expressStuff (req, res, next) {
const resultPromises = things.map(async (thing) => {
try {
return await b(thing); // throws when the promise for this particular thing rejects
} catch (err) {
return defaultValue; // handle error - don't call `next` here
}
});

return res.status(200).json(...)
}

关于javascript - 在 Array#map 中处理异步/等待中的错误(拒绝),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45028436/

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