Итак, я пытаюсь обновить существующий api для поддержки обещаний, но я хочу поддерживать обратную совместимость. Итак, допустим, что это мой апи:Создайте api, который принимает обратный вызов, а также возвращает обещание
module.exports = {
deliverPost: function(callback) {
someAsyncFunction(function(err) {
if (err)
console.log(err);
callback(err);
});
}
}
Это здорово, я могу назвать его и передать обратный вызов, и все работает.
Теперь мы делаем то же самое с обещаниями:
var q = require('q');
module.exports = {
deliverPost: function() {
return q.nfcall(someAsyncFunction).catch(function(err) {
console.log(err);
throw err;
});
}
}
Отлично, теперь она возвращает обещание, но моя проблема в том, какие старые клиенты этого API ожидать, чтобы иметь возможность пройти в обратный вызов!
Так что мне действительно нужно что-то вроде этого:
var q = require('q');
module.exports = {
deliverPost: function(callback) {
return q.nfcall(someAsyncFunction).catch(function(err) {
console.log(err);
throw err;
}).attachNodeStyleCallback(callback);
}
}
Таким образом, новые абоненты могут использовать поддержку обещание, но все еще работает, если вы передадите в обратный вызов.
Это шаблон, используемый, например. jQuery.ajax
- как я могу сделать то же самое с Q.js
?
Вот реализация attachNodeStyleCallback
для справки:
q.makePromise.prototype.attachNodeStyleCallback = function(callback) {
if (!callback)
return this;
return this.then(function(result) {
callback(null, result);
return result;
}, function(err) {
callback(err);
throw err;
})
}
Да, но это МНОГО шаблона по сравнению с приведенным выше примером. Я не хочу делать это повсюду. – bluepnume