【发布时间】:2020-07-01 16:06:15
【问题描述】:
我试图弄清楚如何使用“.then”调用 Promise,以便我可以继续在返回的 Promise 输出上执行其他功能。我已经确认正在使用的功能按预期工作,但在观看视频和其他 SO 示例之后,仍然很难让它工作。见下sn-p:
const fs = require('fs');
const JSZip = require('jszip');
const directoryFile = fs.readdirSync('./zipped');
//console.log(directoryFile);
var zip = new JSZip();
var dir = ('./zipped/');
const readZip = async () => {
const promiseToken = new Promise((resolve, reject) => {
fs.readFile((dir + directoryFile), function (err, data) {
if (err) throw err;
JSZip.loadAsync(data).then(function (zip) {
const files = Object.keys(zip.files);
console.log(files);
files.forEach((files) => {
const pkgName = files.substring(files.indexOf("_", files.indexOf("_")) + 1, files.lastIndexOf("_"));
const fileExt = files.split('.').pop();
const pkgExtract = (pkgName + "." + fileExt);
});
})
});
return promiseToken;
});
};
console.log('Program Starts');
readZip().then((promiseToken) => {
console.log(promiseToken.join(','));
});
console.log('Program Ends');
我不断收到“(节点:1144376)UnhandledPromiseRejectionWarning:ReferenceError:在初始化之前无法访问'promiseToken'”上面的代码块采用文件名数组并循环遍历每个元素并提取文件名的部分并连接这些部分我需要创建一个新文件名的每个元素名称。同样,该功能有效并经过测试。当我尝试通过“.then()”调用“readZip()”的返回输出时不起作用。我需要让这部分工作,这样我才能继续编写脚本的其余部分。我是 NodeJS 和 Javascript 的新手,任何帮助都将不胜感激,因为我尝试过的视频或示例似乎都不起作用.....
【问题讨论】:
-
您的意思是将
return promiseToken;放在readZip的末尾吗?目前您正在从new Promise构造函数回调中重新调整 -
你永远不会兑现你的承诺!您应该将
resolve/reject与readFile中的data/err放在一起,然后将其余逻辑放在then子句中,使用JSZip.loadAsync的承诺链
标签: arrays node.js function asynchronous promise