Javascript 重构承诺从函数返回
我使用JSZip解压一个运行异步的目录。我想编写一个函数来解压文件并返回与之关联的文件,如下所示:Javascript 重构承诺从函数返回,javascript,asynchronous,async-await,Javascript,Asynchronous,Async Await,我使用JSZip解压一个运行异步的目录。我想编写一个函数来解压文件并返回与之关联的文件,如下所示: function unzipFile(filename){ const zipper = new jsZip() return fs.readFile(filename, function(err, data) { return jsZip.loadAsync(data).then(function(zip) { return zip.files }) })
function unzipFile(filename){
const zipper = new jsZip()
return fs.readFile(filename, function(err, data) {
return jsZip.loadAsync(data).then(function(zip) {
return zip.files
})
})
}
但这只是返回
未定义的。如何使其异步,使其在单个函数中返回解压后的目录,并且如果我想将变量设置为等于其输出,则将等待其完成?您需要先promisifyfs.readFile
,然后只需一个常规的承诺链即可
e、 g
您需要先承诺fs.readFile
,然后只有一个常规的承诺链才能做到这一点
e、 g
您需要fs.readFile
:
function readFileAsync(filename) {
return new Promise((resolve, reject) => {
fs.readFile(filename, function(err, data) {
if (err) reject(err);
else resolve(data);
});
});
}
然后,你可以将其链接到:
async function unzipFile(filename) {
const zipper = new jsZip();
const data = await readFileAsync(filename);
const zip = await zipper.loadAsync(data);
return zip.files;
}
您需要fs.readFile
:
function readFileAsync(filename) {
return new Promise((resolve, reject) => {
fs.readFile(filename, function(err, data) {
if (err) reject(err);
else resolve(data);
});
});
}
然后,你可以将其链接到:
async function unzipFile(filename) {
const zipper = new jsZip();
const data = await readFileAsync(filename);
const zip = await zipper.loadAsync(data);
return zip.files;
}
因为在常规回调中返回(您也不这样做)没有效果,您甚至没有使用zipper
-所以,基本原理是错误的,无论如何这是不可能的。学会适应回调。您可以使用async/await关键字作为承诺的语法糖,使其看起来像是在返回值,但在某种程度上,异步函数仍然返回承诺,因此在某些情况下,您仍然需要处理回调。我个人强烈建议人们在理解回调和承诺之前不要使用async/Wait。因为在常规回调中返回(你也不这样做)没有效果,你甚至没有使用zipper
-所以,基本原理是错误的,这是不可能的。学会适应回调。您可以使用async/await关键字作为承诺的语法糖,使其看起来像是在返回值,但在某种程度上,异步函数仍然返回承诺,因此在某些情况下,您仍然需要处理回调。我个人强烈建议人们在理解回调和承诺之前不要使用async/Wait。如果ES2015“箭头函数”绊倒了你,你总是可以通过babel:pnope这样的transpiler运行代码,这正是我的linter告诉我的,如果ES2015“箭头函数”绊倒了你,你总是可以通过像babel:pnope这样的transpiler来运行代码,这正是我的linter告诉我的