2016-06-15 7 views
1

Ich lade Anlagen mit Rest API in SharePoint 2013, dafür muss ich Upload-Anlage Methode auf synchron aufrufen.Promise-Ketten in angularjs

Denn wenn ich Upload-Anlage Methode asynchron aufrufen bekomme ich 409 Konflikt Fehler.

Wie Kette Versprechen Objekte in für loop.i.e Ich möchte Erfolg zweite Befestigungsmethode nennen in der ersten Befestigung und so weiter ..

Bitte helfen Sie mir in bester Ansatz in for-Schleife von Versprechungen Verkettungs.

gemeinsame Methode Anhänge zum Speichern:

var saveFileAngularJS = function (file, url) { 
      var deferred = $q.defer(); 
      getFileBuffer(file).then(function (fileArrBuffer) { 
       $http({ 
        method: 'POST', 
        url: baseUrl + url, 
        headers: { 
         'Accept': 'application/json;odata=verbose', 
         'Content-Type': undefined, 
         'X-RequestDigest': jQuery("#__REQUESTDIGEST").val() 
        }, 
        data: new Uint8Array(fileArrBuffer), 
        transformRequest: []     
       }).then(function successCallback(data) { 
        deferred.resolve(data); 
        alert('Successfully saved.', data); 
       }, function errorCallback(error) { 
        deferred.reject(error); 
        alert('Failed to save!!!.', error); 
       }); 
      }); 
      return deferred.promise; 
     }; 

Methode aufrufen:

for (var i = 0; i < $scope.files.length; i++) { 
     var file = $scope.files[i]._file; 
     var response = lssDealService.insertAttachment(transactionId, file); 
} 

var insertAttachment = function (dealId, file) { 
      var attachmentUrl = listEndPoint + "/GetByTitle('TransactionList')/GetItemById(" + dealId + ")/AttachmentFiles/add(FileName='" + file.name + "')"; 
      return baseService.saveFile(file, attachmentUrl); 
     }; 

Insert Befestigung rufen Savefile-Methode.

Ich möchte diese für Schleife sequenziell ausführen, sobald die Schleife abgeschlossen ist, muss ich alle Versprechen verarbeiten und Erfolgsmeldung an den Benutzer anzeigen.

Bitte helfen Sie mir, die Verkettungsversprechen in effektiver Weise zu schreiben.

+0

Sie können auf "http://jsfiddle.net/jsengel/0ryvkvph/" verweisen – nikhil

Antwort

0

Lassen Sie uns sagen Sie die attachements als Array haben,

function uploadMyAttachements() { 
    return myAttachements.reduce(function(promise, attachment) { 
     return promise.then(function() { 
      return upload(attachment); 
     }) 
     .then(function(result) { 
      console.log('RESULT FOR LAST UPLOAD', result); 
     }); 
    }, Promise.resolve()); 
} 

function upload(attachment) { 
    //upload the attachment to sharepoint 
    //and return a promise here 
} 

uploadMyAttachements().catch(function(err) { 
    //if anything in the promise chain fails 
    //it stops then and there and CATCHED here 
}); 

Jetzt was hier geschieht, mit dem Array.reduce schaffen wir eine Kette von Versprechungen wie unter

upload(0).then(handleResult_0).upload(1).then(handleResult_1).... 
gezeigt

und ausführen einer nach dem anderen, wie Sie

erwartet
0

meine 2 Cent Werfen:

$scope.attachments = []; //modified via binding. 

function uploadAttachments(){ 
//Reduce the files array into a promise array with the uploadOne method 
//then return the promise when every promise has been resolved or one has rejected. 
return $q.all($scope.attachments.reduce(uploadOne, [])); 
} 

function uploadOne(file){ 
//Upload one, return promise. Use $http or $resource. 
} 

//Note - a more advanced way of doing this would be to send the files as batch (one 
//$http post) as FormData. There are some good wrappers for angular. 

$scope.upload = function(){ 
uploadAttachments().then(function(results){ 
    //Array of results 
}).catch(function(e){ 
    //Error handler 
}); 
}