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