2013-12-11 42 views
3

$q.all在其任一功能解決之前即已解決。

我上傳兩個文件使用$阿賈克斯天藍Blob存儲(我不能得到$ HTTP工作):

function doPhotos (result, i) 
    { 
     var d = $q.defer(); 
     var requestData = new Uint8Array($scope.files[i].postArray); 
     $.ajax({ 
      url: result.photos[i].imageUri, 
      type: "PUT", 
      data: requestData, 
      processData: false, 
      beforeSend: function (xhr) 
      { 
       xhr.setRequestHeader('x-ms-blob-type', 'BlockBlob'); 
       xhr.setRequestHeader('x-ms-blob-content-type', $scope.files[i].type); 
       xhr.setRequestHeader('x-ms-meta-uploadvia', 'CORS Demo'); 
       xhr.setRequestHeader('Content-Length', requestData.length); 
      }, 
      success: function (data, status) 
      { 
       d.resolve(data); 

      }, 
      error: function (xhr, desc, err) 
      { 
       console.log('error uploading photo ' + desc); 
       d.resolve(err); 


      } 
     }); 
     return d.promise; 

    } 

這是樹立$q.all功能和被稱爲在ng-click

$scope.createVotation = function() { 
     services.photoset.create($scope.model).then(function (result) { 
      $scope.model.id = result.id; 
      var doPhotosArray= []; 
      for (var i in result.photos) { 
       doPhotosArray[i] = doPhotos(result, i);  
      } 

      $q.all(doPhotosArray).then(function (data) 
      { 
       // this is being called almost immediately before the photos upload 
       $scope.safeApply(function() 
       { 
        $scope.submitting = false; 
        $location.path('/vote/update/' + $scope.model.id); 

       }); 
      }); 

     }); 
    } 
}; 

HTML:

<button ng-click='createVotation()'>Create</button> 

的在調用第一個doPhoto解析之前正在調用q.all->then。我不確定使用jQuery的ajax是否存在一些問題,但我的理解是$q.all應該等到兩個承諾(在我的情況下有2個承諾)在進入then之前完成。

作爲一個補充捻,照片被上傳,所以這是工作,它是$q.all不等待。

+0

應該可以正常工作。看到這個演示增加了1/2秒的延遲來解決4個請求。 http://plnkr.co/edit/Zawd6dBZh6FlRPD0gsrV?p=preview – charlietfl

+0

看看這個plunker:http://plnkr.co/edit/XpGMfak4hzTKic8R3wdR?p=preview q.all永遠不會解決,雖然這兩個函數都做。儘管與我原來的問題不同的問題不能確定它爲什麼會這樣做。我試了一下,沒有超時模擬幾秒鐘。 – lucuma

+0

很奇怪......和我的演示幾乎是一樣的概念....看不出爲什麼它不會觸發 – charlietfl

回答

1

在做了一些研究並考慮了@charlietfl的各種評論之後,我可以讓$ q.all正常工作的唯一方法是將函數調用分配給一個變量,然後將它推入數組中被傳遞給q.all。

for (var i in result.photos) 
{ 
    var output = doPhotos(result, i); 
    doPhotosArray.push(output); 
} 

,我用來參考的各種例子似乎表明,在我原來的問題的代碼應該工作,但沒有。

+0

我知道這個在2013年,但問題是: 'ajax調用 - >返回承諾在某一點 - > q.all',所以承諾可能甚至不會退出,當你調用'q.all'時,我不認爲'q。所有'都會等待,這可能會導致問題 理想情況下,您希望僅將現有的承諾傳遞給obj.p1,obj.p2或數組[p1,p2],然後傳遞給'q.all'。等待p1,p2 ...不適用於之前發生的其他ajax內容。 –