Допустим, у нас есть функция, которая вызывает значительное количество асинхронных функций, например:
downloadAndAssemble = () =>
new Promise(async (resolve, reject) => {
if (!(await checkAvailableDiskSpace())) {
resolve(false);
return;
}
try {
// Download all
let files = await this.downloadAll();
// Assemble File from downloaded snippets.
const assembledFile = await buildFile(files).catch(error => reject(error));
// Save assembled file.
resolve(true);
} catch (err) {
reject(err);
} finally {
const dirExists = await fs.exists(tmpFolderPath);
if (dirExists) await fs.unlink(tmpFolderPath);
}
});
Первая проблема, которую я вижу, это new Promise(async (resolve, reject) => {
, которая является анти-паттерном согласно этой статье SO .
Общая идея, которую я получил из этой статьи, состоит в том, чтобы повторно использовать обещания, если они доступны, а не создавать новые.
Если я следую предложениям в этом ответе SO , я должен использовать .then
и .catch
в логическом потоке функции, чтобы использовать существующие Обещания.
Но это привело бы к большему количеству отступов (то есть по одному на каждое обещание), которые, как я думал, обещания должны помочь устранить.
Как вы можете видеть из .catch(error => reject(error))
код не очень совместим с обработкой ошибок, возникающих из-за содержащихся в нем обещаний.