2015-12-23 10 views
8

मैं एक सरणी है कि प्रत्येक सूचकांक में फ़ाइल नाम शामिल है। मैं एक समय (तुल्यकालिक) पर उन फ़ाइलों एक डाउनलोड करना चाहते। मुझे 'Async' मॉड्यूल के बारे में पता है। लेकिन मुझे पता है कि Lodash या Underscore या Bluebird पुस्तकालय में किसी भी काम करता है इस कार्यक्षमता का समर्थन करता है कि क्या करना चाहते हैं।एक सरणी तुल्यकालिक lodash का उपयोग कर पुनरावृति कैसे, अंडरस्कोर या Bluebird

उत्तर

4

आप उपयोग कर सकते हैं Bluebird के Promise.mapSeries:

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

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

आप क्या फ़ाइल को डाउनलोड करने का उपयोग के आधार पर आप एक वादा निर्माण या नहीं हो सकता है।

अद्यतन 1

केवल का उपयोग कर एक downloadFile() समारोह का एक उदाहरण 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); 
      }); 
     }); 
    }); 
} 

अद्यतन 2

रूप Gorgi Kosev का सुझाव दिया, एक पाश का उपयोग कर वादों की एक श्रृंखला का निर्माण भी काम करता है:

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

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

वादा का एक श्रृंखला आप श्रृंखला में पिछले वादा का ही परिणाम प्राप्त होगा, जबकि mapSeries() आप प्रत्येक वादा के परिणाम के साथ एक सरणी देता है।

+0

mapSeries के बिना: 'वर डाउनलोड = []; (वर पी = Promise.pending() के लिए, मैं = 0; मैं files.length <; +। + i) downloads.push (p = p.then (_ => DownloadFile (फ़ाइलें [i]))); लौट Promise.all (डाउनलोड) ' –

+0

@GorgiKosev आपका कोड काम नहीं करता लेकिन हां, की एक श्रृंखला का निर्माण वादे भी काम करेंगे। हालांकि, 'Promise.all()' का उपयोग करना गलत है, आप 'Promise.all ([p, p, p]) कर रहे हैं, प्रत्येक फ़ाइल को कई बार डाउनलोड किया जाएगा। मैं आपके सुझाव के साथ अपना जवाब अपडेट करूंगा। – Shanoor

+0

नहीं, यह सही नहीं है। एक वादा एक ऑपरेशन का प्रतिनिधित्व करता है जो पहले ही शुरू हो चुका था, और इसे कई बार श्रृंखलाबद्ध करने की कोशिश करने से एक ही ऑपरेशन दोहराया नहीं जा सकता है। 'Promise.all' का उपयोग करने के लिए यह बिल्कुल ठीक है, क्योंकि एक ही वादे में एकाधिक 'फिर' कॉलबैक संलग्न करना ठीक है। –

1

Bluebird का उपयोग कर, वहाँ एक जवाब यहाँ से मिलते-जुलते एक स्थिति है: How to chain a variable number of promises in Q, in order?

यह एक सभ्य समाधान की तरह, लेकिन मेरी राय में बहुत कम पठनीय और async.eachSeries के रूप में सुंदर (मैं जानता हूँ कि आप ने कहा कि में लगता है डॉन 'टी' async 'समाधान चाहते हैं, लेकिन हो सकता है आप पर पुनर्विचार कर सकते हैं

संबंधित मुद्दे