2017-03-24 85 views
0

我正在使用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。我怎样才能使这个异步,以便它在单个函数返回解压目录,如果我想设置一个变量等于它的输出将等待其完成?

+1

因为在常规的回调返回(你不这样做要么)有没有效果 –

+0

你甚至没有使用拉链 - 所以,基本面是错的 –

+0

这是不可能的。学习如何使用回调。您可以使用async/await关键字作为承诺的语法糖,使其看起来像您正在返回的值,但在某个级别上,异步函数仍然会返回承诺,因此在某些时候您需要处理回调。我个人强烈建议人们不要使用异步/等待,直到他们理解回调和承诺。 – slebetman

回答

4

你需要promisify fs.readFile - 然后只是一个普通的无极链应该做的伎俩

例如

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); 
} 
+1

非常感谢,这是非常有益的! – Rob

+0

如果ES2015“箭头功能”让你出行,你总是可以通过像babel这样的转发器运行代码:p –

+0

nope,这几乎是我的棉绒告诉我要做的 – Rob

1

您需要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; 
}