Javascript 重构承诺从函数返回

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 }) })

我使用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
    })
  })
}

但这只是返回
未定义的
。如何使其异步,使其在单个函数中返回解压后的目录,并且如果我想将变量设置为等于其输出,则将等待其完成?

您需要先promisify
fs.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告诉我的