$q.defer() 创建已解决的承诺
$q.defer() creating a resolved promise
就让我脱发的问题寻求帮助! :)
我必须向我消费的 API 发送一系列呼叫。所以我创建了一个工厂,其功能类似于
addItem : function(){
var deferred=$q.defer();
//call to the API
.then(function(response){
deferred.resolve(process(response.data));
}, function(response){
deferred.reject(errorManagement(response.status));
});
}
return deferred.promise;
}
然后我用代码构建了一个数组:
for(var i=0; i<nbOfElements; i++) {
arrayOfPromises[i]=Factory.addItem();
}
$q.all(arrayOfPromises).then(..)
我的预期是 $q.all 只有在对 API 的所有调用都已完成时才会解析。
不幸的是,好像不是这样,然后我显示了部分结果,不满意
经过一番调试,似乎工厂返回的promise都有$$state.status = 1,好像是"resolved"状态,解释了为什么$q.all解决之前我想。
(link to the values of $$state.status)
我仍然觉得这很奇怪,因为我经常使用这个 $q.defer(),但没有 $q.all 它总是工作正常
非常欢迎任何关于这个问题的解释以及如何解决:)
可能我解决不了你的问题,给点建议:
您可以通过返回 API 调用的承诺而不是创建新的承诺来节省大量代码(这是承诺反模式之一)
addItem: function() {
//call to the API
return $http(something).then(function(response){
return process(response.data);
// if you happen need to reject here, use $q.reject(reason/data);
}, function(response){
return $q.reject(errorManagement(response.status));
});
}
我更喜欢使用 push
分配到数组中
var arrayOfPromises = [];
for(var i=0; i<nbOfElements; i++) {
arrayOfPromises.push(Factory.addItem());
}
$q.all(arrayOfPromises).then(..)
你的真实代码中 addItem
函数中没有遗漏 .then
之前的部分,是吗?
只需 return $http.get()
承诺将实际起作用:JSFiddle.
如果您想在 return 输入数据之前在工厂中进行一些预处理(例如您的 process
和 errorManagement
),请查看演示:JSFiddle .
$q.all
回调函数仅在所有承诺都已解决后才被调用。不是因为 $q.all
.
您的数组代码有问题:arrayOfPromises[i]=Factory.addItem();
。你最好使用push
来扩展数组。
就让我脱发的问题寻求帮助! :)
我必须向我消费的 API 发送一系列呼叫。所以我创建了一个工厂,其功能类似于
addItem : function(){
var deferred=$q.defer();
//call to the API
.then(function(response){
deferred.resolve(process(response.data));
}, function(response){
deferred.reject(errorManagement(response.status));
});
}
return deferred.promise;
}
然后我用代码构建了一个数组:
for(var i=0; i<nbOfElements; i++) {
arrayOfPromises[i]=Factory.addItem();
}
$q.all(arrayOfPromises).then(..)
我的预期是 $q.all 只有在对 API 的所有调用都已完成时才会解析。 不幸的是,好像不是这样,然后我显示了部分结果,不满意
经过一番调试,似乎工厂返回的promise都有$$state.status = 1,好像是"resolved"状态,解释了为什么$q.all解决之前我想。 (link to the values of $$state.status)
我仍然觉得这很奇怪,因为我经常使用这个 $q.defer(),但没有 $q.all 它总是工作正常
非常欢迎任何关于这个问题的解释以及如何解决:)
可能我解决不了你的问题,给点建议:
您可以通过返回 API 调用的承诺而不是创建新的承诺来节省大量代码(这是承诺反模式之一)
addItem: function() {
//call to the API
return $http(something).then(function(response){
return process(response.data);
// if you happen need to reject here, use $q.reject(reason/data);
}, function(response){
return $q.reject(errorManagement(response.status));
});
}
我更喜欢使用 push
分配到数组中var arrayOfPromises = [];
for(var i=0; i<nbOfElements; i++) {
arrayOfPromises.push(Factory.addItem());
}
$q.all(arrayOfPromises).then(..)
你的真实代码中 addItem
函数中没有遗漏 .then
之前的部分,是吗?
只需 return $http.get()
承诺将实际起作用:JSFiddle.
如果您想在 return 输入数据之前在工厂中进行一些预处理(例如您的 process
和 errorManagement
),请查看演示:JSFiddle .
$q.all
回调函数仅在所有承诺都已解决后才被调用。不是因为 $q.all
.
您的数组代码有问题:arrayOfPromises[i]=Factory.addItem();
。你最好使用push
来扩展数组。