2015-12-23 3 views

Antwort

4

Sie Promise.mapSeries drossel des verwenden können:

var files = [ 
    'file1', 
    'file2' 
]; 

var result = Promise.mapSeries(files, function(file) { 
    return downloadFile(file); // << the return must be a promise 
}); 

Je nachdem, was Sie Datei zum Download verwenden, können Sie ein Versprechen oder nicht zu bauen.

aktualisieren 1

Ein exemple einer downloadFile() Funktion nur NodeJS:

var http = require('http'); 
var path = require('path'); 
var fs = require('fs'); 

function downloadFile(file) { 
    console.time('downloaded in'); 
    var name = path.basename(file); 

    return new Promise(function (resolve, reject) { 
     http.get(file, function (res) { 
      res.on('data', function (chunk) { 
       fs.appendFileSync(name, chunk); 
      }); 

      res.on('end', function() { 
       console.timeEnd('downloaded in'); 
       resolve(name); 
      }); 
     }); 
    }); 
} 

aktualisieren 2

Als Gorgi Kosev vorgeschlagen, den Aufbau einer Kette von verspricht eine Schleife funktioniert auch:

var p = Promise.resolve(); 
files.forEach(function(file) { 
    p = p.then(downloadFile.bind(null, file)); 
}); 

p.then(_ => console.log('done')); 

Eine Kette von Versprechen erhalten Sie nur das Ergebnis der letzten Versprechen in der Kette, während mapSeries() gibt Ihnen ein Array mit dem Ergebnis jedes Versprechens.

+0

Ohne mapSeries: 'var downloads = []; für (var p = Versprechen.pending(), i = 0; i downloadFile (dateien [i]))); return Promise.all (downloads) ' –

+0

@GorgiKosev Ihr Code funktioniert nicht, aber ja, baut eine Kette von Versprechen würden auch funktionieren. Allerdings ist die Verwendung von 'Promise.all()' hier falsch, Sie machen eine 'Promise.all ([p, p, p])', jede Datei wird mehrmals heruntergeladen. Ich werde meine Antwort mit Ihrem Vorschlag aktualisieren. – Shanoor

+0

Nein, das ist nicht korrekt. Eine Zusage stellt eine Operation dar, die bereits gestartet wurde, und der Versuch, mehrere Male damit zu ketten, führt nicht dazu, dass dieselbe Operation wiederholt wird. Es ist völlig in Ordnung, 'Promise.all' zu verwenden, genauso wie es in Ordnung ist, mehrere' then' Callbacks an ein einzelnes Versprechen anzuhängen. –

1

Drossel verwendet wird, gibt es eine Situation ähnlich wie bei Ihnen mit einer Antwort hier: How to chain a variable number of promises in Q, in order?

Dies scheint eine anständige Lösung, aber meiner Meinung nach viel weniger lesbar und elegant wie async.eachSeries (Ich weiß, Sie sagen, Sie Ich möchte nicht die "async" -Lösung, aber vielleicht können Sie es überdenken.

Verwandte Themen