2016-12-13 3 views
0

Voici un code pour clarifier ce que je suis en train d'accomplir:Comment renvoyez-vous des réponses réussies d'une Promesse dans un tableau après avoir annulé le tableau entier?

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() */ 

disent Maintenant il y a 50 fichiers dans la carte et 10 fichiers de téléchargement des complet avant de frapper un bouton qui annule l'ensemble de promesses. Comment est-ce que je pourrais (je peux?) Retourner les réponses des vidéos déjà téléchargées?

S'il y a quelque chose que je peux faire pour clarifier la question, faites-le moi savoir, merci!

+0

Si elle est annulée, vous ne pouvez pas 'return' quoi que ce soit. Qu'avez-vous l'intention de faire avec les résultats partiels? – Bergi

+0

C'est ce que je pensais mais je voulais m'assurer qu'il n'y avait pas de crochet séparé que je ne connaissais pas. Pour ce cas particulier, je voulais simplement afficher un message à l'utilisateur indiquant le nombre de téléchargements réussis avant que les promesses ne soient annulées. – goodOldFashioned

Répondre

0

Vous pouvez capturer téléchargements terminés par vos promesses résolution:

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 
    } 
} 

Puis:

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