gpt4 book ai didi

node.js - 防止回调被调用两次

转载 作者:搜寻专家 更新时间:2023-11-01 00:07:45 24 4
gpt4 key购买 nike

我有以下代码,但由于它是异步行为(我想),回调被调用了两次。我正在使用 node-unzip 解压缩我从 Internet 下载的文件。

function DownloadAndExtract(file, callback) {
log.debug("Starting download of "+file);
fse.ensureDirSync(tempPath);
var extractor = unzip.Extract({path: tempPath});
extractor.on("close", function() {
log.debug("Done downloading "+file);
return callback(null, file);
});
extractor.on("error", function (err) {
log.error("Extracting download "+file+": "+JSON.stringify(err, null, "\t"));
return callback(err, null); // THIS IS LINE 274
});

var url = "";
if(file == "WONEN") {
url = "https://example.com/file1.zip";
}else if(file == "BOG") {
url = "https://example.com/file2.zip";
}

if(url != "") {
request
.get(url)
.on("error", function (err) {
return callback(err, null);
})
.pipe(extractor);
}else{
return callback(new Error("Invalid file indicator: '"+file+"'"), null);
}
}

我希望 return 实际上退出所有正在运行的异步函数,但这显然是无稽之谈。现在,我不断收到的错误如下:

/home/nodeusr/huizenier.nl/node_modules/async/lib/async.js:30
if (called) throw new Error("Callback was already called.");
^
Error: Callback was already called.
at /home/nodeusr/huizenier.nl/node_modules/async/lib/async.js:30:31
at /home/nodeusr/huizenier.nl/node_modules/async/lib/async.js:251:21
at /home/nodeusr/huizenier.nl/node_modules/async/lib/async.js:575:34
at Extract.<anonymous> (/home/nodeusr/huizenier.nl/realworks.js:274:10)
at Extract.emit (events.js:129:20)
at Parse.<anonymous> (/home/nodeusr/huizenier.nl/node_modules/unzip/lib/extract.js:24:10)
at Parse.emit (events.js:107:17)
at /home/nodeusr/huizenier.nl/node_modules/unzip/lib/parse.js:60:12
at processImmediate [as _immediateCallback] (timers.js:358:17)

log.error() 调用的输出如下:21-02-2015 03:00:05 - [错误] 提取下载 WONEN:{} 所以我很困惑。确实没有错误,那么为什么会发出事件?

如何防止回调在这里被调用两次?联系包的创建者或创建解决方法?

代码调用DownloadAndExtract

async.parallel([
function (callback) {
DownloadAndExtract("WONEN", callback);
},
function (callback) {
DownloadAndExtract("BOG", callback);
}
],
function (err, done) {
if(err) return log.error("Update entries: "+JSON.stringify(err, null, "\t"));
// Do different logic if no error
});

编辑

我的一个尝试是在函数中声明一个 var callbackAlreadyCalled = false,并且在我调用回调的任何给定点,我都会这样做

if(!callbackAlreadyCalled) {
callbackAlreadyCalled = true;
return callback(callback params);
}

这是一个好的方法还是我可以用更好的方式处理它?<​​/p>

编辑2

已经查到空错误是使用JSON.stringify()时出错导致的,但是问题并没有改变。

最佳答案

看起来您有 waterfall 式错误调用。当您调用请求时,它会调用提取器,然后如果出现错误,它会调用提取器的 on_error,然后调用请求的 on_error。

尝试统一错误返回或仅调用一次。进行一项测试,删除您的“on('error'”验证之一。

关于node.js - 防止回调被调用两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28648474/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com