如何正确使用延迟?我这里有两个功能,其中一个延迟正确使用?哪一个使用不正确?为什么resp。为什么不呢?
第一个例子:
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
异步执行某些操作(从外部数据库检索数据)。
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);
});
},
答案 0 :(得分:2)
您在第二个示例 [1] 中正确使用了$q.defer
- 为db.allDocs
异步调用的响应创建了一个承诺(没有别的) 。正如@Benjamin在评论中提到的那样,Altough pochdb似乎已经回复了承诺,因此它是不必要的(但没有错)。
第一个例子只是一团糟,用错误记录和那个不祥的循环来构建承诺。
1:dfd.promise()
除外,它不是函数而是属性。转到dfd.promise.then(…)
。
但是,该循环是一个非常不同的主题,并且在两个片段中似乎都是错误的。一些要点:
return
来自循环体内的回调函数,正好在第一次迭代中完成谓词。oneFunction(qc)
不是异步的,则不需要(读取:不应该)返回承诺 - 如果不是,则.then(…)
调用错误。 anotherFunction(qc)
似乎回复了一个承诺(它就像你说的那样异步)。但你不能将这个承诺传递给.then()
,预计会有回调函数!foo.push(qc)
也是如此 - 它不是您传递给.then()
的回调函数。Promise.all
现在!如果我必须下注,我说你需要
.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);
})