Как преобразовать "пирамиду обратного вызова" в версию, основанную на обещаниях

В настоящее время я изо всех сил пытаюсь понять, как реорганизовать мой код для использования обещаний / библиотеки 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 () - последний обратный вызов):

Итак, как бы я сделал это, используя обещания? Желательно без изменения сигнатур функций (я следовал соглашению, чтобы в качестве последнего параметра использовались обратные вызовы).

1 ответ

Решение

Я не уверен почему 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();
});
Другие вопросы по тегам