让我们说我们有一个函数,它调用了很多异步函数,如下所示:
folder1
我看到的第一个问题是folder2
,即an anti pattern according to this SO article。
从那篇文章中我得到的一般想法是,重用Promises(如果可用),而不是创建新的Promise。
如果我遵循suggestions in this SO answer,则应该在函数的逻辑流程中使用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) => {
来利用现有的Promises。
但这会导致更多的缩进(即每个承诺使用一个缩进),我认为Promises应该有助于消除。
从.then
中可以看到,该代码与处理其中包含的Promises引发的错误不是很一致。
答案 0 :(得分:1)
downloadAndAssemble = async () => {
if (!(await checkAvailableDiskSpace())) {
return false;
}
try {
// Download all
let files = await this.downloadAll();
// Assemble File from downloaded snippets.
const assembledFile = await buildFile(files);
// Save assembled file.
return true;
} finally {
const dirExists = await fs.exists(tmpFolderPath);
if (dirExists) await fs.unlink(tmpFolderPath);
}
};
如果您调用async
函数,它将隐式为您创建一个诺言,如果您return
可以解析,如果您throw
则拒绝,因此不需要手动创建和管理承诺。
.catch(error => reject(error))
毫无意义,因为await
自动履行承诺会使错误冒出来。在您的代码中,这绕过了可能不需要的try { ... } catch { ... }
。
} catch (err) { reject(err); }
同样适用,await
就是您所需要的。