В анализе () вы возвращаете Project.reject (), но анализ () является асинхронной функцией.Поэтому он разрешает любое возвращаемое вами значение и отклоняет любую выдаваемую ошибку.
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');
}
}
Поэтому, когда функция анализа обнаруживает ошибку, вы создаете отклонение, а затем разрешаете функцию.Так что Promise.reject('Error while trying to analyze libs');
не обрабатывается.Поскольку асинхронные функции всегда возвращают обещание, которое разрешается при любом возврате и отклоняет все, что вы бросаете, ваша функция анализа всегда будет разрешаться.Попробуйте сделать это ...
async function analyze(stack, libraries) {
try {
const config = await buildConfiguration(stack, libraries);
return await databaseInsertion(vulnsObject);
} catch (err) {
throw Error('Error while trying to analyze libs');
}
}
Еще одна вещь, которую я вижу как возможную проблему в этом коде, - даже если вы передаете map(async func)
асинхронную функцию, это не волнует.Он не будет ждать завершения каждой функции перед вызовом следующей.
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);
});
Ниже приведены два изменения
const promises = libs.map(async l => await analyze(stack, l)
.catch((err) => { throw new Error(err); }));
return q.allSettled( await 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);
});
Я добавил ожидание перед функцией анализа и ожидание передпередача переменной обещания в q.allSettled()
.