2017-03-24 103 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; 
}