поработал немного в node.js и решил спросить у сообщества — какой подход лучше использовать: callback или deferred?
Собственно пример с callback:
var f1 = function(callback) {
setTimeout(function() {
callback(null, 'f1 done');
}, 100);
};
var f2 = function(callback) {
f1(function(err, data) {
if (err) {
callback(err);
return;
}
// работает с data
callback(null, 'f2 done');
})
};
f2(function(err, data) {
if (err) {
//....
return;
}
console.log(data);
});
Минусы:
1. мне нужно много раз анализировать err. (по сути в каждой функции).
2. по-хорошему нужно не просто вызывать callback(null, data); а дополнительно проверять typeof callback === function, что также вносить дополнительные сложности
Второй подоход — использовать deferred (например jquery)
var $ = require('jquery');
var f1 = function(callback) {
var d = $.Deferred();
setTimeout(function() {
d.resolve('f1 done');
}, 100);
return d.promise();
};
var f2 = function() {
return f1().pipe(function(data) {
// работает с data
return 'f2 done';
});
};
f2().done(function(result) {
console.log(result);
});
Плюс очевиден — мы можем в f2 обрабатывать только успешное выполнение f1, а ошибку передавать дальше и никаких заморочек с проверкой typeof callback