2014-06-06 113 views
0

我有一個函數調用一個異步函數(在一個循環中),它將爲我提供一個函數下一次調用的參數。我認爲編寫代碼會更有意義,所以這是我試過的(沒有成功)。 我知道很多問題已經被問及這個問題,但我真的嘗試了我所看到的一切。AngularJS - 延期遞歸承諾

removeMultipleAttachments: function(docid, rev, attachmentIDs) { 
     var requests = []; 
     var deferred = $q.defer(); 
     var p = $q.when(); 
     console.log(attachmentIDs); 
     angular.forEach(attachmentIDs, function(file, index) { 
      p = p.then(function (formerRes) { 

       return pouch.removeAttachment(docid, attachmentIDs[index].name, rev, function (err, res) { 
        $rootScope.$apply(function() { 
         if (err) { 
          deferred.reject(err); 
         } else { 
          rev = res.rev; 
          console.log(rev); 
          deferred.resolve(res); 
         } 
        }) 
       }); 
      }); 
      requests.push(p); 
     }) 
     $q.all(requests).then(function(){ 
      console.log('DONE'); 
     }); 

     return deferred.promise; 
    } 
+0

我首先看到的是 var p = $ q.when(); 應該是 var p = $ q.defer(); – DrDyne

+0

您是否需要依次刪除附件,或者您不關心訂單? –

+0

好的,但是當()不應該用在承諾中? – ncohen

回答

0

因爲你需要一個新rev每個removeAttachment(),您不能使用$q.all(),您需要使用then()以保證異步調用順序,如:

removeMultipleAttachments: function(docid, rev, attachmentIDs) { 
    console.log(attachmentIDs); 
    var p = $q.when(); 
    angular.forEach(attachmentIDs, function(file, index) { 
     p = p.then(function (formerRes) { 
      var deferred = $q.defer(); 

      pouch.removeAttachment(docid, attachmentIDs[index].name, rev, function (err, res) { 
       if (err) { 
        deferred.reject(err); 
       } else { 
        rev = res.rev; 
        console.log(rev); 
        deferred.resolve(res); 
       } 
       $rootScope.$apply(); 
      }); 

      return deferred.promise; 
     }); 

    return p.then(function(res) { 
     console.log('DONE'); 
     return res; 
    }); 
} 
+0

謝謝你,它解決了我的大部分問題,但是當所有的承諾完成後,哪裏可以添加一個函數或console.log('DONE')? – ncohen

+0

哦,我也需要趕上最後的迴應...我應該怎麼做才能夠調用這個函數如下:removeMultipleAttachments(docid,rev,attachmentIDs).then(function(response){... catch this here ...}) – ncohen

+0

@ncohen我更新了我的答案,看看。 –