Javascript 在AngularJS中有条件地创建承诺

Javascript 在AngularJS中有条件地创建承诺,javascript,angularjs,Javascript,Angularjs,我有一个从本地存储获取的items数组 var items = JSON.parse($window.localStorage.selectedResources)['server']; var arr = []; var idsArray = []; angular.forEach(items, function (item) {

我有一个从本地存储获取的items数组

                   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'});
};