Javascript 添加[0]会导致回调调用两次吗?

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

我正在为一些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 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);