如何避免显式构造反模式并保持缩进/回调低

时间:2019-05-29 10:01:01

标签: javascript promise es6-promise

让我们说我们有一个函数,它调用了很多异步函数,如下所示:

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引发的错误不是很一致。

1 个答案:

答案 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就是您所需要的。