कहा गया था, मैं ETIMEDOUT
या ECONNRESET
त्रुटि प्राप्त करता हूं, जब चलाता है तो त्रुटि Callback was already called
त्रुटि होती है।Async.js - ETIMEDOUT और कॉलबैक को पहले से ही
पहले मैंने सोचा था कि ऐसा इसलिए था क्योंकि onEachLimitItem
कॉलबैक को कॉल करने से पहले मुझे return
शामिल नहीं था। तो मैंने इसे async multiple callbacks documentation प्रति शामिल किया। अभी भी इसे हल नहीं कर रहा है। मैंने त्रुटि घटना को हटाने और त्रुटि घटना में प्रत्येक लाइव पर कॉलबैक को हटाने का भी प्रयास किया है, लेकिन न तो काम किया है। मैंने Callback already called
के मुद्दे के आसपास अन्य SO प्रश्नों को देखा है, लेकिन क्योंकि वे धाराओं से चिंतित नहीं हैं, मुझे समाधान नहीं मिला।
मेरी समझ यह है कि यदि स्ट्रीम ECONNRESET
जैसी त्रुटि का सामना करती है, तो यह त्रुटि घटना में कॉलबैक वापस कर देगी और अगली स्ट्रीम पर जायेगी, लेकिन ऐसा लगता है कि ऐसा नहीं लगता है। यह लगभग लगता है कि त्रुटि स्वयं को हल करती है यानी यह फिर से कनेक्ट हो जाती है और फिर से Azure को गड़बड़ किए गए स्टीम को भेजने की कोशिश करता है और यह काम करता है, फिर यह 'फिनिश' ईवेंट ट्रिगर करता है, और हमें Callback already called
मिलता है।
क्या मैं स्ट्रीम घटनाओं के भीतर कॉलबैक को सही तरीके से प्रबंधित कर रहा हूं?
var Q = require('q');
var async = require('async');
var webshot = require('webshot');
var Readable = require('stream').Readable;
var azure = require('azure-storage');
var blob = azure.createBlobService('123', '112244');
var container = 'awesome';
var countries = [
'en-us', 'es-us', 'en-au', 'de-at', 'pt-br', 'en-ca', 'fr-ca', 'cs-cz', 'ar-ly', 'es-ve',
'da-dk', 'fi-fi', 'de-de', 'hu-hu', 'ko-kr', 'es-xl', 'en-my', 'nl-nl', 'en-nz', 'nb-no',
'nn-no', 'pl-pl', 'ro-ro', 'ru-ru', 'ca-es', 'es-es', 'eu-es', 'gl-es', 'en-gb', 'es-ar',
'nl-be', 'bg-bg', 'es-cl', 'zh-cn', 'es-co', 'es-cr', 'es-ec', 'et-ee', 'fr-fr', 'el-gr',
'zh-hk', 'en-in', 'id-id', 'en-ie', 'he-il', 'it-it', 'ja-jp', 'es-mx', 'es-pe', 'en-ph'
];
var uploadStreamToStorage = function (fileName, stream, onEachLimitItem) {
var readable = new Readable().wrap(stream);
var writeable = blob.createWriteStreamToBlockBlob(container, fileName);
readable.pipe(writeable);
writeable.on('error', function (error) {
return onEachLimitItem.call(error);
});
writeable.on('finish', function() {
onEachLimitItem.call(null);
});
};
var takeIndividualScreenshot = function (ID, country, onEachLimitItem) {
var fileName = ID + '-' + country + '.jpg';
var url = 'https://example.com/' + country + '/' + ID;
webshot(url, function (error, stream) {
if (error) { throw 'Screenshot not taken'; }
uploadStreamToStorage(fileName, stream, onEachLimitItem);
});
};
var getAllCountriesOfId = function (ID) {
var deferred = Q.defer();
var limit = 5;
function onEachCountry(country, onEachLimitItem) {
takeIndividualScreenshot(ID, country, onEachLimitItem);
}
async.eachLimit(countries, limit, onEachCountry, function (error) {
if (error) { deferred.reject(error); }
deferred.resolve();
});
return deferred.promise;
};
var createContainer = function() {
var df = Q.defer();
var self = this;
blob.createContainerIfNotExists(this.container, this.containerOptions, function (error) {
if (error) { df.reject(error); }
df.resolve(self.container);
});
return df.promise;
};
createContainer()
.then(function() {
return getAllCountriesOfId('211007');
})
.then(function() {
return getAllCountriesOfId('123456');
})
.fail(function (error) {
log.info(error);
});
एक बात मैं देख रहा हूँ कि जब मैं यह मेरी वी एम (रैम की 3GB) पर बनाम स्थानीय स्तर पर (रैम 8GB) चलाने के लिए, कि स्क्रिप्ट जब 'ECONNRESET' त्रुटि फेंक करने के लिए जारी है मैं इसे मेरे वीएम पर चलाएं। – Blexy