Arrays Execute.Then()承诺NodeJS

Arrays Execute.Then()承诺NodeJS,arrays,node.js,function,asynchronous,promise,Arrays,Node.js,Function,Asynchronous,Promise,我正在试图弄清楚如何使用“.then”调用承诺,这样我就可以继续对返回的承诺输出执行其他函数。我已经确认所使用的函数按预期工作,但在观看视频和其他SO示例后,我仍然很难让它正常工作。请参阅下面的代码片段: const fs=require('fs'); const JSZip=require('JSZip'); const directoryFile=fs.readdirSync('./zipped'); //log(directoryFile); var zip=newjszip(); va

我正在试图弄清楚如何使用“.then”调用承诺,这样我就可以继续对返回的承诺输出执行其他函数。我已经确认所使用的函数按预期工作,但在观看视频和其他SO示例后,我仍然很难让它正常工作。请参阅下面的代码片段:

const fs=require('fs');
const JSZip=require('JSZip');
const directoryFile=fs.readdirSync('./zipped');
//log(directoryFile);
var zip=newjszip();
var dir=('./压缩/');
const readZip=async()=>{
const promiseToken=新承诺((解决、拒绝)=>{
fs.readFile((dir+directoryFile),函数(err,data){
如果(错误)抛出错误;
loadAsync(数据).then(函数)(zip){
const files=Object.keys(zip.files);
console.log(文件);
files.forEach((文件)=>{
const pkgName=files.substring(files.indexOf(“\u0”),files.indexOf(“\u0”)+1,files.lastIndexOf(“\u0”);
const fileExt=files.split('.').pop();
常量pkgExtract=(pkgName+“+fileExt);
});
})
});
归还承诺书;
});
};
log(“程序启动”);
readZip()。然后((promiseToken)=>{
log(promiseToken.join(',');
});

log(“程序结束”)
您似乎漏掉了一行,正在从promiseToken的构造函数返回
promiseToken
,而不是从
readZip
的定义返回。因此,
readZip
不返回任何内容,您将得到一个
未定义的值

将其移动到正确的位置,您应该会没事:

const readZip=async()=>{
const promiseToken=新承诺((解决、拒绝)=>{
fs.readFile((dir+directoryFile),函数(err,data){
如果(错误)抛出错误;
loadAsync(数据).then(函数)(zip){
const files=Object.keys(zip.files);
console.log(文件);
files.forEach((文件)=>{
const pkgName=files.substring(files.indexOf(“\u0”),files.indexOf(“\u0”)+1,files.lastIndexOf(“\u0”);
const fileExt=files.split('.').pop();
常量pkgExtract=(pkgName+“+fileExt);
});
})
});
});
return promiseToken;//已移到此处
};

您似乎漏掉了一行,正在从promiseToken的构造函数返回
promiseToken
,而不是从
readZip
的定义返回。因此,
readZip
不返回任何内容,您将得到一个
未定义的值

将其移动到正确的位置,您应该会没事:

const readZip=async()=>{
const promiseToken=新承诺((解决、拒绝)=>{
fs.readFile((dir+directoryFile),函数(err,data){
如果(错误)抛出错误;
loadAsync(数据).then(函数)(zip){
const files=Object.keys(zip.files);
console.log(文件);
files.forEach((文件)=>{
const pkgName=files.substring(files.indexOf(“\u0”),files.indexOf(“\u0”)+1,files.lastIndexOf(“\u0”);
const fileExt=files.split('.').pop();
常量pkgExtract=(pkgName+“+fileExt);
});
})
});
});
return promiseToken;//已移到此处
};
您需要:

  • 在readZip函数中返回承诺(目前您没有这样做)
  • 用您想要的数据解决承诺(目前您根本没有解决)
  • 在中使用该数据。然后像这样:
  • 您需要:

  • 在readZip函数中返回承诺(目前您没有这样做)
  • 用您想要的数据解决承诺(目前您根本没有解决)
  • 在中使用该数据。然后像这样:

  • 如果您使用
    fs.promises
    接口,其中
    fs.promises.readfile()
    已经是一个返回承诺的版本,那么这会简单得多:

    const readZip = async () => {
        const data = await fs.promises.readFile(dir + directoryFile);
        const zip = await JSZip.loadAsync(data);
        const files = Object.keys(zip.files);
        console.log(files);
        return files;
    };
    
    
    readZip.then(files => {
        for (file of files) {
            const pkgName = file.substring(file.indexOf("_", file.indexOf("_")) + 1, file.lastIndexOf("_"));
            const fileExt = file.split('.').pop();
            const pkgExtract = pkgName + "." + fileExt;
            console.log(pkgExtract);
        }
    })
    

    如果您使用
    fs.promises
    接口,其中
    fs.promises.readfile()
    已经是一个返回承诺的版本,那么这会简单得多:

    const readZip = async () => {
        const data = await fs.promises.readFile(dir + directoryFile);
        const zip = await JSZip.loadAsync(data);
        const files = Object.keys(zip.files);
        console.log(files);
        return files;
    };
    
    
    readZip.then(files => {
        for (file of files) {
            const pkgName = file.substring(file.indexOf("_", file.indexOf("_")) + 1, file.lastIndexOf("_"));
            const fileExt = file.split('.').pop();
            const pkgExtract = pkgName + "." + fileExt;
            console.log(pkgExtract);
        }
    })
    

    你的意思是把
    返回承诺令牌
    readZip
    的末尾?当前,您正在从
    新承诺
    构造函数回调重新调整您的承诺!您应该
    使用
    读取文件
    中的
    数据
    /
    错误
    解决
    /
    拒绝
    ,然后将其余逻辑放入
    然后
    子句中,使用
    JSZip的承诺链。loadAsync
    您是否打算放置
    返回promiseToken
    readZip
    的末尾?当前,您正在从
    新承诺
    构造函数回调重新调整您的承诺!您应该使用
    读取文件
    中的
    数据
    /
    错误
    解决
    /
    拒绝
    ,然后将其余逻辑放在
    然后
    子句中,最初尝试此配置时,我无法获得JSZip.loadAsync(数据)的输出。然后(functionn(zip){}创建了forEach循环。如何包含包含“files.forEach”的承诺循环?除此之外,此解决方案确实有效,只是不幸的是,它不像我希望的那样……最初尝试此配置时,我无法获得JSZip.loadAsync(data)的输出。然后(functionn(zip){}创建了forEach循环。我如何包含包含“files.forEach”的承诺循环?除此之外,这个解决方案确实有效,只是不幸的不是我希望的那样….补充道:“const promiseToken=new Promise((数据,err)=>{}”,我返回pr