プロミス初心者です。
ローカルにあるzipフォルダを解凍してから、展開されたフォルダを読み込みたいです。
それをするために、zipフォルダを解凍するをawaitしてから展開されたフォルダを読み込みたく思い、
awatiできるunzip関数を作りました。
使用するライブラリは以下です。
bluebird
https://www.npmjs.com/package/bluebird
unzipper
https://www.npmjs.com/package/unzipper
fs-extra
https://www.npmjs.com/package/fs-extra
js
1// unzip module 2 3import fs from 'fs-extra' 4import unzipper from 'unzipper' 5import Promise from 'bluebird' 6 7export default ({ inputDirPath, outputFilePath }) => { 8 return new Promise(async (resolve, reject, onCancel) => { 9 try { 10 await streamPromise(fs.createReadStream(inputDirPath).pipe(unzipper.Extract({ path: outputFilePath }))) 11 resolve() 12 } catch (error) { 13 reject(error) 14 } 15 }) 16} 17 18const streamPromise = (stream) => { 19 return new Promise((resolve, reject) => { 20 stream.on('end', () => { 21 resolve('end') 22 }) 23 stream.on('finish', () => { 24 resolve('finish') 25 }) 26 stream.on('error', (error) => { 27 reject(error) 28 }) 29 }) 30}
最初は
js
1export default ({ inputDirPath, outputFilePath }) => { 2 return new Promise(async (resolve, reject, onCancel) => { 3 try { 4 await fs.createReadStream(inputDirPath).pipe(unzipper.Extract({ path: outputFilePath })) 5 resolve() 6 } catch (error) { 7 reject(error) 8 } 9 }) 10}
このように書いてしまって、fs.createReadStreamの返り値はPromiseじゃなくてstream?だからawaitができず、resolveがfs.createReadStreamを追い越してしまっていました...。
そこで、
https://github.com/jprichardson/node-fs-extra/issues/433
こちらの記事を参考にしてみたら、1つ目のコードでうまくいきました。
しかし、streamPromise関数のことなど、全然理解できてません。
またストリームというものもよく理解できてません。
これは一体どういうことなのでしょうか。
なぜawaitができるのでしょうか。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2019/05/24 00:01
退会済みユーザー
2019/05/24 00:32
2019/05/24 06:43 編集