如何将"callback pyramid"重构为基于承诺的版本



我目前正在努力真正理解如何重构代码以使用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();
});

相关内容

  • 没有找到相关文章

最新更新