Как правильно использовать отсрочку? У меня есть две функции здесь, в которых один отсрочка используется правильно? В каком из них он используется неправильно? И почему. почему нет?Как использовать defer() правильный путь?
Первый пример:
getFoo1: function() {
var dfd = $q.defer();
db.allDocs({include_docs: true}, function(err, response) {
if(err) {
console.log(err);
dfd.reject(err);
} else {
var qcs = [];
for(var i=0; i < response.total_rows; i++) {
if(response.rows[i].doc.type == 'bar') {
var qc = {id: response.rows[i].doc._id,
isFoo: true
};
oneFunction(qc)
.then(anotherFunction(qc))
.then(qcs.push(qc));
}
}
dfd.resolve(qcs);
}
});
return dfd.promise;
},
Второй пример:
getFoo2: function() {
var dfd = $q.defer();
db.allDocs({include_docs: true}, function(err, response) {
if(err) {
dfd.reject(err);
} else {
dfd.resolve(response);
}
});
return dfd.promise
.then(function(response) {
var foo = [];
for(var i=0; i < response.total_rows; i++) {
if(response.rows[i].doc.type == 'bar') {
var qc = {id: response.rows[i].doc._id,
isFoo: true
};
return oneFunction(qc)
.then(anotherFunction(qc))
.then(foo.push(qc));
}
}
}, function(err){
console.log(err);
});
},
oneFunction
ничего не делает асинхронно.
anotherFunction
делает что-то асинхронно (получение данных из внешней базы данных).
EDIT: Благодаря @Bergi правильной функции должен выглядеть следующим образом:
getFoo3: function() {
var dfd = $q.defer();
db.allDocs({include_docs: true}, function(err, response) {
if(err) {
dfd.reject(err);
} else {
dfd.resolve(response);
}
});
return dfd.promise
.then(function(response) {
var foos = [];
for (var i=0; i < response.total_rows; i++) {
if (response.rows[i].doc.type == 'bar') {
var qc = {id: response.rows[i].doc._id,
isFoo: true
};
var foo = oneFunction(qc);
foos.push(foo);
}
}
var promises = foos.map(anotherFunction); // make a promise for each foo
return $q.all(promises);
}, function(err){
console.log(err);
});
},
в 'затем' вы должны передать ссылку на функцию, но вместо того, чтобы вам мгновенный вызов функции, как' anotherFunction (дс) '. Так кажется, что в обоих он неправильно использовался :-) – Grundy
Не могли бы вы рассказать о своем комментарии, пожалуйста? В какой части? Как должна выглядеть функция, @Grundy? – thadeuszlay
если вы объясните, что вы ожидали, я могу попробовать объяснить, как это должно быть. В любом случае я имею в виду '.то (anotherFunction (qc)) 'должно быть как' .then (function() {anotherFunction (qc)}) 'до тех пор, пока функция' otherFunction' не будет возвращена – Grundy