を実行すると、ETIMEDOUT
またはECONNRESET
のエラーが続き、Callback was already called
エラーが続きます。Async.js - ETIMEDOUTとコールバックが既に呼び出されていました
onEachLimitItem
コールバックを呼び出す前に、私がreturn
を含めていなかったためだと思いました。だから私はasync multiple callbacks documentationごとにそれを含めた。まだそれを解決していない。また、エラーイベントを取り除き、エラーイベントのonEachLimitへのコールバックを削除しようとしましたが、どちらもうまくいきませんでした。私はCallback already called
号の周りの他のSOの質問を見ましたが、彼らはストリームに関係していないので、私は解決策を見つけることができませんでした。
私の理解では、ECONNRESET
のようなエラーが発生した場合、エラーイベントでコールバックを返し、次のストリームに移りますが、これは当てはまりません。エラーは、それがコネクトを再すなわち自分自身を解決し、再びアズールにエラーが発生した蒸気アップを送信しようとすると、それはほとんどようで、それはそれが「完了」イベントをトリガし、そして我々は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);
});
ことの一つは、私は(RAMの8ギガバイト)ローカル対私のVM(RAMの3ギガバイト)でこれを実行すると、スクリプトがとき 'ECONNRESET'エラーをスローし続けていることであるということであるIそれを私のVM上で実行してください。 – Blexy