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