gpt4 book ai didi

node.js - 未处理的拒绝 promise 异步等待链

转载 作者:搜寻专家 更新时间:2023-10-31 22:24:16 24 4
gpt4 key购买 nike

我对 javascript 中的异步等待还很陌生,所以这个问题可能是我不知道的。

我有这个

  async function foo(req, res, next) {
try {
await scan(req.params.stack);
res.send('ok');
} catch (err) {
res.status(500).send('fail');
}
}

async function scan(stack) {
try {
const libs = [1,2,3];
const promises = libs.map(async l => analyze(stack, l)
.catch((err) => { throw new Error(err); }));
return q.allSettled(promises)
.then((results) => {
const rejected = results.filter(r => r.state === 'rejected');
if (rejected.length === results.length) throw new Error('Failed');
return results;
})
.catch((err) => {
throw new Error(err);
});
} catch (err) {
throw new Error(err);
}
}

async function analyze(stack, libraries) {
try {
const config = await buildConfiguration(stack, libraries);
return await databaseInsertion(vulnsObject);
} catch (err) {
return Promise.reject('Error while trying to analyze libs');
}
}

不知何故,我收到了这个疯狂的警告,我不知道我在哪里没有发现错误。

当然,为了测试错误,我正在使构建配置失败,但我没有使用正常的流程来处理错误,而是得到了这个:

(node:415) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 3): Error: Error while trying to analyze libs

我使用 async await 好吗?为了链接异步等待,我应该遵循什么模式?

奇怪的是 foo 函数运行良好,这意味着 res.status.(500).send('fail');有效,我得到了回应

当我使用 native promise 时,没有出现此错误。

我真的被困在这里

最佳答案

在使用 async-await 扫描函数时,您将 .then() .catch() waterfall 与 awaitasync-await 处理 promise 的能力与 .then() 一样好。因此,请坚持使用一种流程,并尝试将两者混合在一个函数中或将一个函数混合在另一个函数中。

async foo(req, res, next) {
try {
await scan(req.params.stack);
res.send('ok');
} catch (err) {
res.status(500).send('fail');
}
}

async scan(stack) {
try {
const libs = [1,2,3];

// This libs.map functions return promise. then why not use await?
const promises = await libs.map(async l => analyze(stack, l);

// Again q.allSettled returns promise, use await here too
let results = await q.allSettled(promises);

const rejected = results.filter(r => r.state === 'rejected');

if (rejected.length === results.length) throw new Error('Failed');

return results;

}

// If any promise call reject function will be in catch
catch (err) {
throw new Error(err);
}
}

async function analyze(stack, libraries) {
try {
const config = await buildConfiguration(stack, libraries);
return await databaseInsertion(vulnsObject);
}
catch (err) {
console.log(err);
return null;
}
}

关于node.js - 未处理的拒绝 promise 异步等待链,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52373878/

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