angularjs - $q.all not working as expected? -


can please explain me why q.all not working?

i have 5 promises download images blob files. have 5 promises upload these blobs servers use. use backend-as-a-service quickblox callback on successful upload provides amazon aws url link. need take these links , upload them servers know user associated images.

the 5 downloads , uploads seem work, upload url not working. before each resolve happens in uploads function, callback sets $scope.amazon_urls = callback url provided. therefore when q.all.runs, expect $scope.amazon_urls exist. not case. going on?

order of functions is: 1)

here function upload urls. i've commented sections i'm thinking causing issues.

function uploadurls(scope,principal){  qb.data.list(classname,{user_id:principal.user_id},function(err,res){     if (err){       console.log(err);       return err;     } else {       console.log(res)     var data = {       _id: res.items[0]._id,       image1: scope.amazon_urls[0],  // accessing these values should set after q.all       image2: scope.amazon_urls[1],  // null value indicates        image3: scope.amazon_urls[2],  //the callback function has not set yet       image4: scope.amazon_urls[3],  // function should occur after q.all       image5: scope.amazon_urls[4]   // shouldn't set already?   }   qb.data.update(classname,data,function(e,r){     if (e){       console.log(e);       return e;     } else {      console.log(r);       return r;         }   });   } }); } 

here button executes download / upload promises , pushes them array $scope.promises

$scope.selectpictureforprofile = function(t){ var deferred = $q.defer(); var qbdeferred = $q.defer(); var promise = xhrpromise(deferred,t.photo,$scope,$scope.currently_selected).then(function(blob){     qbcreateanduploadpromise(qbdeferred,$scope,$scope.currently_selected,blob);   }); $scope.promises.push(promise); 

}

here button runs q.all. once resolved,

$scope.save_photos = function(){  $q.all($scope.promises).then(function(response){     uploadurls($scope,principal);   // seems execute before last promise }); 

}

here function download images...

function xhrpromise(deferred,url,scope,i){   var xhr = new xmlhttprequest();     xhr.open('get', url, true);     xhr.responsetype = 'blob';     xhr.onload = function(e) {       if (this.status == 200) {         var myblob = this.response;         scope.image_blobs[i] = myblob;         deferred.resolve(myblob);       } else {         deferred.reject("");       }     };   xhr.send();    return deferred.promise; } 

here function upload images...

function qbcreateanduploadpromise(deferred,scope,i,blob){   qb.content.createandupload({'file':blob,'name':"profilepics.jpg", 'type':"image/jpeg", 'public': true },function(e,r){         if(e){           deferred.reject("error");         } else {           scope.amazon_urls[i]= "http://qbprod.s3.amazonaws.com/" + r.uid;           deferred.resolve("http://qbprod.s3.amazonaws.com/"+ r.uid);          }  });  return deferred.promise; } 

after difficulty turns out q.all firing right after first promises fired.

however since chained first set of promises expecting q.all fire after second set of promises.

in order them fire after first set had create array of promises first set use

.then(function(){$q.all(second_set_of_promises).then(third_final_set_of_promises)});

in way, third set of promises fires after second set complete , second set fires when first set complete.


Comments

Popular posts from this blog

java - How to specify maven bin in eclipse maven plugin? -

single sign on - Logging into Plone site with credentials passed through HTTP -

php - Why does AJAX not process login form? -