Javascript 在AngularJS中有条件地创建承诺
我有一个从本地存储获取的items数组Javascript 在AngularJS中有条件地创建承诺,javascript,angularjs,Javascript,Angularjs,我有一个从本地存储获取的items数组 var items = JSON.parse($window.localStorage.selectedResources)['server']; var arr = []; var idsArray = []; angular.forEach(items, function (item) {
var items = JSON.parse($window.localStorage.selectedResources)['server'];
var arr = [];
var idsArray = [];
angular.forEach(items, function (item) {
idsArray.push(item.id);
});
然后我启动一个API调用
//Make the API call
ds.getBillInfo(idsArray)
.then(function(response){
var serversList = [];
for (var key in response) {
// iterate over response
问题是,如果items数组为空,则idsArray
也是空的。
然后错误显示无法读取未定义的的属性“Then”
我想做的是即使IDSRarray是空的,我也希望行在块内执行,因为没有承诺
我该怎么做
编辑
如果我执行$q.all([ds.getBillInfo(idsArray)])
,则不会出现错误
getBillInfo()
看起来像:
this.getBillInfo = function(idsArray){
if(!idsArray.length) return;
var segmentUrl = '';
for(var i =0;i<idsArray.length;i++){
if(i != (idsArray.length-1))
segmentUrl += 'ids='+idsArray[i]+'&';
else
segmentUrl += 'ids='+idsArray[i];
}
return HttpWrapper.send('/api/bill?bill=t&'+segmentUrl, {"operation": 'GET'});
};
this.getBillInfo=函数(idsArray){
如果(!idspnArray.length)返回;
var segmentUrl='';
对于getBillInfo
中的(var i=0;i用新承诺包装您的逻辑,并在空数组中解决它
比如:
self.getBillInfo = function(array){
var deferred = $q.defer();
if(array.length == 0){
deferred.resolve([]); // return empty list
}
else{
var segmentUrl = '';
for(var i =0;i<idsArray.length;i++){
if(i != (idsArray.length-1))
segmentUrl += 'ids='+idsArray[i]+'&';
else
segmentUrl += 'ids='+idsArray[i];
}
HttpWrapper.send('/api/bill?bill=t&'+segmentUrl, {"operation": 'GET'})
.then(function (response) {
deferred.resolve(response.data);
}
, function (error) {
deferred.reject(error);
});
}
return deferred.promise;
}
注入$q服务,以便在getBillInfo()
中可以访问它。然后,您可以在$q.resolve()
中包装一个值,以做出返回该值的承诺。(该值甚至可以是另一个承诺。)因此,如果getBillInfo()
函数有时需要在没有值的情况下提前返回,只需返回一个空的$q.resolve()
,以确保始终返回承诺
this.getBillInfo = function(idsArray){
//This returns undefined and causes your error.
if(!idsArray.length) return;
//This returns a promise that resolves immediately and executes your .then() handler.
if(!idsArray.length) return $q.resolve();
//This returns a promise that rejects immediately and executes your .catch() handler
if(!idsArray.length) return $q.reject();
var segmentUrl = '';
for(var i =0;i<idsArray.length;i++){
if(i != (idsArray.length-1))
segmentUrl += 'ids='+idsArray[i]+'&';
else
segmentUrl += 'ids='+idsArray[i];
}
return HttpWrapper.send('/api/bill?bill=t&'+segmentUrl, {"operation": 'GET'});
};
this.getBillInfo=函数(idsArray){
//这将返回未定义并导致错误。
如果(!idspnArray.length)返回;
//这将返回一个立即解析并执行.then()处理程序的承诺。
如果(!idspnArray.length)返回$q.resolve();
//这将返回一个立即拒绝并执行.catch()处理程序的承诺
如果(!idspnArray.length)返回$q.reject();
var segmentUrl='';
对于(var i=0;i您需要修复getBillInfo
以始终返回承诺有些东西不在这里…就像@SLaks所说的那样…即使返回Promise.reject('empty')
这样的东西也会起作用,您最终会陷入困境,或者Promise.resolve()
到resolve@Pytth请查看更新,“我的方法”返回一个承诺。@StruglingCoder:不,它不返回;否则,您就不会有问题。请阅读第一行。请注意,如果(!idspnArray.length)return
,则返回的位置为。return$q.resolve()相反,如果HttpWrapper.send
已经返回了一个承诺,这是多余的。它可以工作,但使用$q.defer()
实际上是为了在您还没有承诺的情况下创建一个承诺。这太复杂了,因此不是最佳做法。@JCFord同意,但看起来很清楚,无论如何,我会用您的方式更新答案;)
this.getBillInfo = function(idsArray){
//This returns undefined and causes your error.
if(!idsArray.length) return;
//This returns a promise that resolves immediately and executes your .then() handler.
if(!idsArray.length) return $q.resolve();
//This returns a promise that rejects immediately and executes your .catch() handler
if(!idsArray.length) return $q.reject();
var segmentUrl = '';
for(var i =0;i<idsArray.length;i++){
if(i != (idsArray.length-1))
segmentUrl += 'ids='+idsArray[i]+'&';
else
segmentUrl += 'ids='+idsArray[i];
}
return HttpWrapper.send('/api/bill?bill=t&'+segmentUrl, {"operation": 'GET'});
};