Javascript 添加[0]会导致回调调用两次吗?
我正在为一些minecraft的东西写实用程序,不管怎样。。。首先,我有一段代码,可以从存档中提取指定的文件,并在回调中提供这些文件的内容:Javascript 添加[0]会导致回调调用两次吗?,javascript,node.js,Javascript,Node.js,我正在为一些minecraft的东西写实用程序,不管怎样。。。首先,我有一段代码,可以从存档中提取指定的文件,并在回调中提供这些文件的内容: const unzip = require("unzip-stream"); const Volume = require("memfs").Volume; const mfs = new Volume(); const fs = require("fs"); function getFile(archive, path, cb) { let c
const unzip = require("unzip-stream");
const Volume = require("memfs").Volume;
const mfs = new Volume();
const fs = require("fs");
function getFile(archive, path, cb) {
let called = false;
fs.createReadStream(archive)
.pipe(unzip.Parse())
.on("entry", function(entity) {
if (path.includes(entity.path)) {
entity.pipe(mfs.createWriteStream("/" + path))
.on("close", function() {
mfs.readFile("/" + path, function(err, content) {
if (!called) cb(content);
called = true;
mfs.reset();
});
}).on("err", () => {});
} else {
entity.autodrain();
}
});
}
module.exports = { getFile };
当我在交互式控制台中测试它时,它工作得非常完美:
require("./zip").getFile("minecraft-mod.jar", ["mcmod.info", "cccmod.info"], console.log); // <= Works fine! Calls callback ONCE!
它也很好用。但是魔法来了
因此,.json文件可以包含数组或对象。如果它是数组,我们需要取它的第一个元素:
if (modinfo[0]) modinfo = modinfo[0];
它起作用了
但是,如果它是对象,我们需要在中获取modlist
属性的第一个元素:
else modinfo = modinfo.modlist[0];
如果modinfo是,那么对象boom-callback现在会触发两次!什么
但是,如果我从else条件中删除[0]:
else modinfo = moninfo.modlist; // <= No [0]
同样的事情发生了
而且,它的调用没有参数
我试图调查——回调调用了两次。再次读取zip提取器代码。。。它有以下几行:
这:
let called = false;
以及:
if (!called) cb(content);
called = true;
因此,如果出于某种原因,即使这种情况发生两次:
if (path.includes(entity.path)) {
它不应该调用回调,对吗?不不仅如此,如果我想
console.log(called);
它将记录两次false
NodeJS版本:v8.0.0
完整代码:
函数启动信号检查(){
清除();
const files=fs.readdirSync(“../mods”);
async.eachSeries(文件、函数(文件、cb){
console.log(“[>]”,文件);
zip.getFile(“../mods/”+文件,[“mcmod.info”,“cccmod.info”],函数(内容){
控制台日志(内容);
log(Buffer.isBuffer(content));
如果(content!=未定义)content=content.toString();
如果(!content)返回cb();
让modinfo=Object.create(JSON.parse(content.replace(/(\r\n |\n |\r)/gm,“”));
if(modinfo[0])modinfo=modinfo[0];
else modinfo=modinfo.modlist[0];
//如果(!modinfo.name)返回cb();
/*curse.searchMod(modinfo.name、modinfo.version、curse.versions[modinfo.mcversion],函数(链接){
如果(!link)返回cb();
signature.generateMD5(“../mods/”+文件,函数(localSignature){
signature.URLgenerateMD5(链接、函数(游标签名){
if(localSignature==curseSignature){
console.log(文件“-ППаПаПаПаааиааааа;
}否则{
console.log文件(file.bgWhite.red+“-ППаПааааааааааа107;
}
cb();
});
});
});*/
});
});
}
问题是我使用的是modlist
而不是modlist
。不是这样的!感谢您的解决方案,尽管我很感激您提出的非常全面的问题,但请您将带注释的代码原封不动地放在一个大区块中,好吗?更容易read@MattFletcher所有使用modinfo
的代码都被注释掉。你在说什么回调?zip.getFile
modlist
的@Barmar one应该是modlist
。哈哈,经典:D
if (path.includes(entity.path)) {
console.log(called);