如何重构“;回调金字塔”;转换为基于承诺的版本

How to refactor a "callback pyramid" into promise-based version

本文关键字:于承诺 版本 承诺 转换 金字塔 何重构 重构 回调      更新时间:2023-09-26

我目前正在努力真正理解如何重构代码以使用promises/Q库。

考虑以下常见的基本示例:我有一个测试用例,它将同一个文件两次导入mongodb,然后检查第二次导入的数据集名称在末尾是否有修饰符。

importDataSet('myFile.csv',function () {
  importDataSet('myFile.csv',function () {
    DataSet.find({title: 1}, function (err, result) {
        result.length.should.be.equal(2);
        result[0].title.should.startWith('myFile');
        result[1].title.should.startWith('myFile');
        result[0].title.should.not.be.equal(result[0].title);
        done();
      });
    });
  });
  done();
}); 

(done()是最后一次回调):

那么,我该如何使用承诺来做到这一点呢?最好在不更改函数签名的情况下,(我按照约定将回调作为最后一个参数)。

我不确定为什么done()在您的代码中被调用两次,但如果没有这一点,它可能看起来类似于:

importDataSet('myFile.csv')
  .then(function () {
  return importDataSet('myFile.csv')
}).then(function () {
  return DataSet.find({title: 1})
}).then(function (result) {
  result.length.should.be.equal(2);
  result[0].title.should.startWith('myFile');
  result[1].title.should.startWith('myFile');
  result[0].title.should.not.be.equal(result[0].title);
  done();
});