重构承诺从函数返回

时间:2017-03-24 02:47:18

标签: javascript asynchronous async-await

我正在使用JSZip解压缩运行异步的目录。我想编写一个解压缩文件并返回与之关联的文件的函数,如下所示:

.outer {
  display: inline-block;
  width: auto;
  background: green;
  padding: 5px;
}
.second {
  background: yellow;
}
.second, .first {
  display: block;
  width: 100%;
}
.first {
  background: white;
  width: 200px;
}
.label {
  display: inline-block;
  width: 100px;
  background: orange;
  margin: 5px;
  transition: width ease .5s;
}
.outer:hover .label {
  width: 300px;
}

但这只是返回<div class="outer"> <div class="first">foo</div> <div class="second"> <div class="label"> bar </div> </div> </div>。我如何使这个异步,以便它在单个函数中返回解压缩的目录,如果我想设置一个等于其输出的变量将等待它的完成?

2 个答案:

答案 0 :(得分:5)

你需要首先宣传fs.readFile - 然后只是一个普通的Promise链应该做的伎俩

e.g。

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 :(得分:1)

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