【发布时间】:2016-08-27 15:41:50
【问题描述】:
我环顾四周,我很确定回调没有被调用两次。不管怎样,下面是我的代码:
async.eachSeries(saveProps,function(photo,doneMaster){
var tries = 0;
async.retry({times: 10, interval: 200},
function(done, results){
debug('attempt num: ' + (++tries));
aws.getFile(photo.s3_location,function(err,s){
if(err){
debug('error:' + err);
return done(err);
}else{
done(null,s);
}
})
},
function(err,imageStream){
if(err){return doneMaster(err);}
else{
debug('appending photo to zip: %s', photo.s3_location);
zip.append(imageStream, {name: photo.saveName});
doneMaster();
}
}
);
},function(err){
if(err){
reject(err);
}else{
zip.finalize();
}
});
这个问题的一点背景是,我正在尝试以一个接一个的方式迭代一些照片信息,并将数据从 s3 流式传输到一个 zip 文件中。我正在尝试为许多照片(几千张)制作这项工作。由于一个图像返回 ECONNRESET,该过程会出错。每当发生这种情况时,我都想再试一次。我遇到的问题是,每当图像引发 ECONNRESET 并重试时,异步库都会引发回调已被调用的错误。我一直在看这个,我不会调用它两次。
我的问题,done() 怎么会被调用两次?
关于我正在使用的对象/包的一些信息:
堆栈跟踪信息:
app:worker attempt num: 1 +1ms
app:worker error:Error: read ECONNRESET +91ms
/appdir/node_modules/async/dist/async.js:803
if (fn === null) throw new Error("Callback was already called.");
^
Error: Callback was already called.
at /appdir/node_modules/async/dist/async.js:803:36
at /appdir/node_modules/async/dist/async.js:3481:17
at /appdir/node_modules/async/dist/async.js:307:31
at /appdir/node_modules/async/dist/async.js:3755:21
at ClientRequest.<anonymous> (/appdir/modules/zip-worker.js:348:44)
at emitOne (events.js:77:13)
at ClientRequest.emit (events.js:169:7)
at TLSSocket.socketErrorListener (_http_client.js:256:9)
at emitOne (events.js:77:13)
at TLSSocket.emit (events.js:169:7)
at emitErrorNT (net.js:1253:8)
at nextTickCallbackWith2Args (node.js:442:9)
at process._tickCallback (node.js:356:17)
在此堆栈跟踪中,/appdir/modules/zip-worker.js:348:44 是 done(null,s); 所在的行。
【问题讨论】:
-
如果出现两个错误怎么办?
-
你能详细说明吗?
-
对不起;我误解了你的代码。回调错误的堆栈跟踪是什么?
-
我已经编辑了我的原始问题以包含堆栈跟踪。
标签: javascript node.js asynchronous