如何避免显式构造反模式并仍然保持 indentation/callbacks 低
how to avoid the explicit-construction anti-pattern and still keep indentation/callbacks low
假设我们有一个函数,它调用相当多的异步函数,如下所示:
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) => {
即 .
我从那篇文章中得到的一般想法是重用 Promise(如果可用),而不是创建新的。
如果我遵循 ,我应该在函数的逻辑流程中使用 .then
和 .catch
来利用现有的 Promises。
但这会导致更多的缩进(即每个使用的承诺一个),我认为 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
就拒绝,所以有无需创建和管理承诺 "manually".
.catch(error => reject(error))
毫无意义,因为 await
承诺会自动让错误冒出来。在您的代码中,这绕过了可能不需要的 try { ... } catch { ... }
。
同样适用于} catch (err) { reject(err); }
,await
即可。
假设我们有一个函数,它调用相当多的异步函数,如下所示:
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) => {
即
我从那篇文章中得到的一般想法是重用 Promise(如果可用),而不是创建新的。
如果我遵循 .then
和 .catch
来利用现有的 Promises。
但这会导致更多的缩进(即每个使用的承诺一个),我认为 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
就拒绝,所以有无需创建和管理承诺 "manually".
.catch(error => reject(error))
毫无意义,因为 await
承诺会自动让错误冒出来。在您的代码中,这绕过了可能不需要的 try { ... } catch { ... }
。
同样适用于} catch (err) { reject(err); }
,await
即可。