2013-12-11 3 views
3

Решение $q.all разрешается, прежде чем любая из его функций разрешится.

Я загрузки двух файлов в лазурной хранения больших двоичных объектов с помощью $ .ajax (я не мог получить $ 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> 

q.all->then вызывается до того, как вызывается даже первое решение doPhoto. Я не уверен, есть ли проблема с использованием jQuery ajax, но я понимаю, что $q.all должен дождаться, пока обе обещания (в моем случае есть 2) не будут выполнены до ввода then.

Как добавленный поворот, фотографии загружаются так, что это работает, это $q.all, что не ждет.

+0

Должно работать нормально. См. Эту демонстрацию, которая увеличивает задержку в 1/2 секунды для разрешения 4 запросов. http://plnkr.co/edit/Zawd6dBZh6FlRPD0gsrV?p=preview – charlietfl

+0

Проверьте этот плункер: 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 call -> обещание возврата в какой-то момент -> q.all', поэтому обещания могут даже не выходить, когда вы вызываете' q.all', я не думаю 'q. все 'будут ждать, что может вызвать проблемы. В идеале вы хотите передать только существующие обещания либо как obj.p1, obj.p2, либо array [p1, p2], которые затем переходите к' q.all'. дождитесь p1, p2 ... не для других событий ajax, которые произошли ранее. –

Смежные вопросы