2016-12-13 2 views
0

Hier ist ein Code zu klären, was ich zu tun versuche:Wie geben Sie erfolgreiche Antworten von einem Promise innerhalb eines Arrays zurück, nachdem das gesamte Array abgebrochen wurde?

import Promise from 'bluebird'; 

function uploadAll(items){ 
    return Promise.map(items, function(item){ 
     return upload(item); 
    }, {concurrency: 5}); 
} 

function upload(item){ 
    return new Promise(function(resolve, reject, onCancel){ 
     onCancel(){ 
      /* Abort upload */ 
     } 
    }) 
    .then(function(response){ 

    }); 
} 

var items = /* Array of items */ 
var uploadPromises = uploadAll(items) 
        .then(response){ 
         /* Do something here with response, 
         this won't be hit on cancellation */ 
        } 
        .finally(){ 
         /* This is the only block that will be hit, 
          is it possible to get responses here? */ 
        } 

/* Event listener on button that activates uploadPromises.cancel() */ 

Jetzt sagen, dass es 50 Dateien in der Karte und 10 Dateien den Upload, bevor Sie eine Taste schlagen, die das Array von Versprechen brechen. Wie würde ich (kann ich?) Antworten von den bereits abgeschlossenen Uploads zurückgeben?

Wenn es etwas gibt, was ich tun kann, um die Frage klarer zu machen, lass es mich wissen, danke!

+0

Wenn es gelöscht ist, kann man nicht 'return' nichts. Was beabsichtigen Sie mit den Teilergebnissen zu tun? – Bergi

+0

Das ist, was ich dachte, aber wollte sicherstellen, dass es keinen separaten Haken gab, von dem ich nicht wusste. Für diesen speziellen Fall wollte ich einfach eine Nachricht an den Benutzer anzeigen, die angibt, wie viele erfolgreiche Uploads es gab, bevor die Versprechen abgesagt wurden. – goodOldFashioned

Antwort

0

Sie können abgeschlossen Uploads erfassen, wie Ihre Versprechen lösen:

function uploadAll(items) { 
    var completed = []; 
    var callback = Promise.map(items, function (item) { 
     return upload(item) 
      .then(function (rx) { 
       completed.push(item); 
       return rx; 
      }); 
    }, {concurrency: 5}); 

    return { 
     completed: completed, 
     callback: callback 
    } 
} 

Dann:

var uploadJob = uploadAll(items); 
// Wait for all uploads 
uploadJob.callback 
    .finally(function() { 
     // check uploadJob.completed  
    }); 
Verwandte Themen