2016-01-22 62 views
1

嗨那里我一直在尝试使用承诺技术来等待for循环内的调用的执行。但是我无法坚持。等待角工厂资源调用完成循环内

“回归mainArr” 给出了不确定

//导出CSV

//Assumes data is a json object list. 

function getCustomData(data){ 

      var mainArr=[]; 
      for (var i = 0; i < data.length; i++) { 
       var obj={}; 
       obj.word = $('#type-ahead-input').val(); 
       obj.synonym = data[i].word; 
       obj.similarityCount = (data[i].similarityCount).toFixed(2); 
       obj.emailCount = data[i].occuranceCount; 
       obj.synonymlist = getSynonymList(data[i].word); 
       mainArr.push(obj); 

      } 
      return mainArr; 
     } 
     function getSynonymList(inputWord){ 
      return WordService.getSynonymList({ 
       ids : inputWord 
      }).$promise 
        .then(function($response) { 
         var output = $response; 

         var wordList =[]; 
         for (var i = 0; i < output.length; i++) { 
          wordList.push(output[i].word); 
         } 

         return wordList; 
        }); 
     } 

工厂资源调用签名

getSynonymList : { 

     method : 'GET', 
     isArray: true, 
     async : false, 
     url : appRoot + '/synonym', 
     params : { 
      word : '@word' 
     } 
    }, 
+1

getCustomData的返回值不能是未定义的。 –

+0

'$ promise.then'方法中的onFulfilled回调的** return **导致'$ q'承诺,** not data **。对于返回'$ resource'对象的服务使用相同的名称'getSynonymList',并且返回承诺的函数会使您的代码混淆并难以理解。 – georgeawg

回答

1

您需要推值转换成承诺阵列,并使用$q.all()来解决多个承诺

function getCustomData(data){ 

     var promises = []; // an array of promises 
     for (var i = 0; i < data.length; i++) { 
      // rest of you code here 

      var promise = $q.when(data); // returns a promise    
      promises.push(obj); 
     } 

     return $q.all(promises); 
    } 

那么你可以使用回调

myservice.getCustomerData(data).then(
    function successcallback(returnvalue){ 
    console.log(returnvalue); 
    }, 
    function errorcalback(error){ 
    console.log(returnvalue); 
} 

这适用于你的函数,调用的返回值,因为使用的是循环。 (注意,我没有实现上面的代码,但应该提供一个大纲)