मैं एक सरणी है कि प्रत्येक सूचकांक में फ़ाइल नाम शामिल है। मैं एक समय (तुल्यकालिक) पर उन फ़ाइलों एक डाउनलोड करना चाहते। मुझे 'Async
' मॉड्यूल के बारे में पता है। लेकिन मुझे पता है कि Lodash
या Underscore
या Bluebird
पुस्तकालय में किसी भी काम करता है इस कार्यक्षमता का समर्थन करता है कि क्या करना चाहते हैं।एक सरणी तुल्यकालिक lodash का उपयोग कर पुनरावृति कैसे, अंडरस्कोर या Bluebird
उत्तर
आप उपयोग कर सकते हैं 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()
आप प्रत्येक वादा के परिणाम के साथ एक सरणी देता है।
Bluebird का उपयोग कर, वहाँ एक जवाब यहाँ से मिलते-जुलते एक स्थिति है: How to chain a variable number of promises in Q, in order?
यह एक सभ्य समाधान की तरह, लेकिन मेरी राय में बहुत कम पठनीय और async.eachSeries के रूप में सुंदर (मैं जानता हूँ कि आप ने कहा कि में लगता है डॉन 'टी' async 'समाधान चाहते हैं, लेकिन हो सकता है आप पर पुनर्विचार कर सकते हैं
- 1. lodash: एक सरणी
- 2. Bluebird coroutine उपयोग
- 3. lodash?
- 4. जांचें कि ऑब्जेक्ट्स की एक सरणी अंडरस्कोर
- 5. golang में, एक का उपयोग कर दो सरणियों पुनरावृति करने के लिए कैसे `
- 6. अंडरस्कोर का उपयोग कैसे करें
- 7. पता लगाना कि _ लॉनाश है या अंडरस्कोर
- 8. nodejs में lodash/underscore का उपयोग करके दो सरणी के बीच अंतर कैसे प्राप्त करें
- 9. अलामोफायर का उपयोग करके एक तुल्यकालिक अनुरोध कैसे करें?
- 10. lodash संग्रह में चर नाम का उपयोग कर
- 11. lodash
- 12. jQuery: से अधिक नेस्टेड तत्वों का उपयोग कर पुनरावृति प्रत्येक
- 13. dispatch_apply तुल्यकालिक या असीमित है?
- 14. टाइपप्रति में Bluebird का उपयोग कैसे करें 2.1+
- 15. पुनरावृति
- 16. एक बहुआयामी सरणी (अंडरस्कोर का उपयोग करके) को कैसे मैप करें?
- 17. Lodash वापसी सरणी यदि पथ मान्य है
- 18. lodash का उपयोग कर किसी ऑब्जेक्ट के पहले n तत्व कैसे प्राप्त करें?
- 19. जवामेल असीमित या तुल्यकालिक है?
- 20. अंडरस्कोर का उपयोग कर कई मानों से सरणी मानों को फ़िल्टर करना संभव है?
- 21. वहाँ() setState का एक तुल्यकालिक विकल्प Reactjs
- 22. underscore और lodash
- 23. कैसे JQuery का उपयोग कर यदि इनपुट तत्व एक सरणी
- 24. आईओएस, iVar का उपयोग कर अंडरस्कोर बनाम सीधे
- 25. Lodash - खोजें वस्तु
- 26. कार्यान्वयन request.postAsync Bluebird
- 27. विस्तार() अंडरस्कोर बनाम रीढ़ की हड्डी का उपयोग कर
- 28. एक अंडरस्कोर
- 29. lodash 'शामिल' काम नहीं कर रहा
- 30. COM का उपयोग कर एक सरणी पास कर रहे हैं?
mapSeries के बिना: 'वर डाउनलोड = []; (वर पी = Promise.pending() के लिए, मैं = 0; मैं files.length <; +। + i) downloads.push (p = p.then (_ => DownloadFile (फ़ाइलें [i]))); लौट Promise.all (डाउनलोड) ' –
@GorgiKosev आपका कोड काम नहीं करता लेकिन हां, की एक श्रृंखला का निर्माण वादे भी काम करेंगे। हालांकि, 'Promise.all()' का उपयोग करना गलत है, आप 'Promise.all ([p, p, p]) कर रहे हैं, प्रत्येक फ़ाइल को कई बार डाउनलोड किया जाएगा। मैं आपके सुझाव के साथ अपना जवाब अपडेट करूंगा। – Shanoor
नहीं, यह सही नहीं है। एक वादा एक ऑपरेशन का प्रतिनिधित्व करता है जो पहले ही शुरू हो चुका था, और इसे कई बार श्रृंखलाबद्ध करने की कोशिश करने से एक ही ऑपरेशन दोहराया नहीं जा सकता है। 'Promise.all' का उपयोग करने के लिए यह बिल्कुल ठीक है, क्योंकि एक ही वादे में एकाधिक 'फिर' कॉलबैक संलग्न करना ठीक है। –