如何避免显式构造反模式并仍然保持 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即可。