【发布时间】:2015-07-01 13:17:24
【问题描述】:
如何正确使用 defer?我这里有两个函数,其中一个 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 异步执行某些操作(从外部数据库检索数据)。
编辑:感谢@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);
});
},
【问题讨论】:
-
到
then你应该传递对函数的引用,但是你可以像anotherFunction(qc)这样即时调用函数。所以似乎两者都使用不正确:-) -
能否详细说明您的评论?在哪个
then部分?相反,@Grundy 函数应该是什么样子? -
如果你解释你的期望,我可以试着解释它应该如何。无论如何,我的意思是
.then(anotherFunction(qc))应该像.then(function(){anotherFunction(qc)})直到anotherFunction不返回函数 -
anotherFunction()如何得到它的参数qc,@Grundy? -
关闭需要 :-)
标签: javascript promise deferred