var articles = arg;
articles.forEach(function(data){
var promises = [fetchImg(data), fetchUser(data)];
$q.all(promises).then(function (res) {
finalData.push(res[1]);
});
});
return finalData;
我想在finalData
循环结束后才返回forEach
数组。有没有办法用承诺链接它?什么会先执行foreach循环,然后在循环结束后返回数组?
答案 0 :(得分:3)
您可以像这样修改代码:
function fetArticles(arg) {
var articles = arg;
var promises = [], finalData = [];
var deferred = $q.defer();
articles.forEach(function(data) {
var userPromise = fetchUser(data);
userPromise.then(function (res) {
finalData.push(res[1]);
});
promises.push(fetchImg(data));
promises.push(userPrommise);
});
$q.all(promises).then(function() {
deferred.resolve({finalData: finalData, foo: "bar"});
});
return deferred.promise;
}
现在,调用此方法并注册最终回调:
fetArticles(arg).then(function(data) {
console.log("finalData: ", data.finalData, data.foo === "bar");
});
答案 1 :(得分:3)
链接 返回值(或承诺)到.then
方法中的处理函数。使用$q.all
合并多个承诺,function fetchUsers(arg) {
var articles = arg;
var promises = articles.map(function(a){
var subPromises = [fetchImg(a), fetchUser(a)];
return $q.all(subPromises).then(function (res) {
//return for chaining
return {img: res[0], user: res[1]};
});
});
//consolidate promises
var finalPromise = $q.all(promises);
return finalPromise;
};
本身会返回可链接承诺。
.then
因为调用promise的.then
方法会返回一个新的派生promise,所以很容易创建一个promise链。可以创建任意长度的链,并且由于可以使用另一个承诺(将进一步推迟其解析)来解决承诺,因此可以在链中的任何点暂停/推迟承诺的解析。 { {3}}
返回的承诺将解决使用一组用户的问题,或者在第一个错误时解决被拒绝的问题。使用承诺的.catch
和 fetchUsers(args)
.then ( function onFulfilled(objArray) {
$scope.users = objArray.map(x => x.user);
return objArray;
}).catch ( function onRejected(response) {
console.log("ERROR: ", response);
throw response
})
;
方法检索最终解决方案。
$q.defer
$q.defer()
反模式使用from yapsy.PluginManager import PluginManager
manager = PluginManager()
manager.setPluginPlaces(["plugins"])
manager.collectPlugins()
for plugin in manager.getAllPlugins():
plugin.plugin_object.print_name()
的问题在于它会破坏promise链,丢失错误信息,并且在错误处理不当时可能会造成内存泄漏。有关详细信息,请参阅1。