2017-09-17 103 views
0

我正在嘗試使用$ q.all()等待一堆promises解決。爲此,我創建了一個Promises數組,並將其傳遞給all()方法,但這似乎不起作用。 Promises數組充滿了$ resource對象返回的promise,這是在每次迭代中創建的,我認爲這是問題,因爲promises數組是異步填充的。

我已經得出這個結論,因爲$ q.all()方法返回的承諾數組,承諾數組始終是一個空數組。這就像$ q.all()方法不會等待數組填滿。但我不確定這是否是問題。我真的很感謝在這個問題上的任何幫助,如果不可能通過$ q.all()實現我想要的,我希望看到其他解決所有promise後執行代碼的其他方法。

這是我目前使用的

 var promisesArray = [];    
     var images, postObject; 
     files.readFile('images.txt') 
     .then(function (data) { 
      images= angular.fromJson(data);     
      images.forEach(function (image, idx) { 
       var deferred = $q.defer();      
       if (!image.sent) { 
        files.readFile(image.name) 
        .then(function (data) { 
         postObject = angular.fromJson(data); 
         $resource(EndPointsService.baseURL + "images").save(postObject, function(data) { 
          deferred.resolve(data); 
          if (data.status) {          
           image.sent= true;          
          } 
         },function(error){ 
          console.log(error); 
         }); 
         promisesArray.push(deferred.promise); 
        },function(error){ 
         console.log(error); 
        }); 
       } 
      }); 


       $q.all(promisesArray).then(function (data) { 
        console.log(data); 
        files.writeFile("images.txt", images) 
        .then(function (data) {       
         console.log(data); 
        }, function (error) { 
         console.log(error); 
        }); 
       }); 
     },function(error){ 
      console.log(error) 
     }); 
+0

你應該推承諾的承諾陣列異步'readFile'通話之外。你已經在上面創建了延遲,所以你可以將它添加到數組中。 – anson

+0

當你說我應該「把它放在那裏」時,你的意思是在延期申報後的下一行中? –

+0

那麼,從技術上講,你是在if語句之上創建延遲。所以如果這個條件是錯誤的,你已經創建了一個沒有理由的延期。您應該將延遲創建和添加到該條件內的數組。 – anson

回答

1

承諾的.then方法返回從數據返回給它一個新的承諾的代碼。

創建承諾陣列.then方法和return$q.all承諾到.then方法:

̶v̶a̶r̶ ̶p̶r̶o̶m̶i̶s̶e̶s̶A̶r̶r̶a̶y̶ ̶=̶ ̶[̶]̶;̶    
var images, postObject; 
var arrayPromise = files.readFile('images.txt') 
    .then(function (data) { 
    ͟v͟a͟r͟ ͟p͟r͟o͟m͟i͟s͟e͟s͟A͟r͟r͟a͟y͟ ͟=͟ ͟[͟]͟;͟ 
    images= angular.fromJson(data);     
    images.forEach(function (image, idx) { 
     ̶v̶a̶r̶ ̶d̶e̶f̶e̶r̶r̶e̶d̶ ̶=̶ ̶$̶q̶.̶d̶e̶f̶e̶r̶(̶)̶;̶      
     if (!image.sent) { 
      var promise = files.readFile(image.name) 
       .then(function (data) { 
       postObject = angular.fromJson(data); 
       var url = EndPointsService.baseURL + "images" 
       ͟r͟e͟t͟u͟r͟n͟ $resource(url).save(postObject).$promise; 
      }); 
      promisesArray.push(promise); 
     }; 
    }); 
    ͟r͟e͟t͟u͟r͟n͟ $q.all(promisesArray); 
}); 


arrayPromise.then(function (dataArray) { 
    console.log(dataArray); 
    //Process data here 
}); 
+0

非常感謝你,完全解決了我的問題。 –

+0

很高興知道它有幫助。請將答案標記爲已接受,以便其他人知道問題已得到解答。 – georgeawg