javascript - 如何避免显式构造反模式并仍然保持缩进/回调低
问题描述
假设我们有一个函数,它调用相当数量的异步函数,如下所示:
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);
}
});
我看到的第一个问题是根据这篇 SO 文章new Promise(async (resolve, reject) => {
这是一种反模式。
我从那篇文章中得到的一般想法是重用 Promises(如果可用),而不是创建新的 Promises。
如果我遵循这个 SO 答案中的建议,我应该在函数.then
的.catch
逻辑流程中使用现有的 Promises。
但这会导致更多的缩进(即每个使用的承诺一个),我认为承诺应该有助于消除。
从.catch(error => reject(error))
代码中可以看出,它与处理其中包含的 Promises 引发的错误不是很一致。
解决方案
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
是你所需要的。
推荐阅读
- express - 使用 IIS 托管 express node.js 后端
- android - 将在不支持的设备上安装 ARCore android 应用
- python - 无法通过 python 中的 fbchat 登录 FB [2FA 未启用]
- qt - QML:Flickable 的接受按钮
- kubernetes - k8s:为什么 coredns 不能在主节点上运行?
- swift - 快速更改键盘建议栏文本
- r - 是否有用于在渐变色散点图上绘制线性回归的 R 库
- r - 我无法替换数据框列中 R 中的字符值
- reactjs - 如何将我的反应功能转换为反应组件?
- python - 收听firebase数据库流时无法在pyqt5 gui中添加Qwidget