【问题标题】:Refactoring promise to return from function重构承诺从函数返回
【发布时间】:2017-03-24 02:47:17
【问题描述】:

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

但这只是返回undefined。我怎样才能使这个异步,以便它在一个函数中返回解压缩的目录,如果我想设置一个等于它的输出的变量将等待它的完成?

【问题讨论】:

  • 因为在常规回调中返回(您也不这样做)没有效果
  • 你甚至没有使用zipper - 所以,无论如何,基本面都是错误的
  • 不可能。学会适应回调。您可以使用 async/await 关键字作为 Promise 的语法糖,使其看起来像您正在返回值,但在某种程度上,异步函数仍然返回一个 Promise,因此在某些时候您无论如何都需要处理回调。我个人强烈建议人们在理解回调和承诺之前不要使用 async/await。

标签: javascript asynchronous async-await


【解决方案1】:

您需要先承诺 fs.readFile - 然后只需一个常规的 Promise 链就可以解决问题

例如

function unzipFile(filename){
    return new Promise((resolve, reject) => fs.readFile(filename, function(err, data) {
        if(err) {
            return reject(err);
        }
        resolve(data);
    }))
    .then(data => new jsZip().loadAsync(data))
    .then(zip => zip.files);
}

【讨论】:

  • 如果 ES2015 的“箭头函数”绊倒你,你总是可以通过像 babel 这样的编译器运行代码:p
  • 不,我的 linter 几乎就是这么告诉我的
【解决方案2】:

你需要promisifyfs.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;
}

【讨论】:

    猜你喜欢
    • 2017-04-05
    • 2020-08-26
    • 1970-01-01
    • 2019-12-17
    • 1970-01-01
    • 2019-01-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多