鍍金池/ 問(wèn)答/HTML/ 如何確保在數(shù)組forEach所有回調(diào)函數(shù)執(zhí)行完成后, 執(zhí)行接下來(lái)的步驟

如何確保在數(shù)組forEach所有回調(diào)函數(shù)執(zhí)行完成后, 執(zhí)行接下來(lái)的步驟

背景是文件遍歷并對(duì)每個(gè)文件執(zhí)行操作
用同步遍歷得到了每個(gè)文件的路徑, 并保存在一個(gè)數(shù)組中
數(shù)組forEach傳入函數(shù), 使用了模塊node-exiftool來(lái)讀取每個(gè)文件(主要是圖片)的信息, 這就創(chuàng)造了一堆的回調(diào)函數(shù), 不斷地鏈?zhǔn)?code>.then操作
node-exiftool需要在信息讀取結(jié)束后使用.then(() => ep.close())來(lái)結(jié)束程序
怎么判斷所有的回調(diào)函數(shù)都完成了呢?

node-exiftool給出的示例

const exiftool = require('node-exiftool')
const ep = new exiftool.ExiftoolProcess()

ep
  .open()
  // display pid
  .then((pid) => console.log('Started exiftool process %s', pid))
  .then(() => ep.readMetadata('photo.jpg', ['-File:all']))
  .then(console.log, console.error)
  .then(() => ep.readMetadata('photo2.jpg', ['-File:all']))
  .then(console.log, console.error)
  .then(() => ep.close())
  .then(() => console.log('Closed exiftool'))
  .catch(console.error)

寫(xiě)成模塊, 我把這個(gè)過(guò)程分成了三個(gè)步驟: 開(kāi)啟, 讀取, 關(guān)閉

const exiftool = require('node-exiftool')
const exiftoolBin = require('dist-exiftool')
const ep = new exiftool.ExiftoolProcess(exiftoolBin)
exports.openExif = () => ep.open()
exports.getDate = (openedEp, path, cb) => {
    return openedEp
        .then(() => ep.readMetadata(path, ['charset filename=utf8', 'CreateDate']))
        .then(cb, console.error)
}
exports.closeExif = finishedEp => finishedEp.then(ep.close()).catch(console.error)

然后另一個(gè)文件調(diào)用該模塊

let openedEP = exif.openExif()
fileArr.forEach((item) => {
    openedEp = exif.getDate(openedEP, item, handleDate)
    function handleDate(metadata) {
        let date = parse(metadata.data[0].CreateDate)
        console.log(path.basename(item) + ': ' + date.toJSON())
    }
})

控制臺(tái)前兩行輸出

(node:11208) MaxListenersExceededWarning: Possible EventEmitter memory leak detected. 11 finish listeners added. Use emitter.setMaxListeners() to increase limit
(node:11208) MaxListenersExceededWarning: Possible EventEmitter memory leak detected. 11 finish listeners added. Use emitter.setMaxListeners() to increase limit

不知道是為什么
而且程序不會(huì)退出
圖片描述

初學(xué)者, 求各位有經(jīng)驗(yàn)的大大解答

回答
編輯回答
礙你眼

自己解決了, 還是對(duì)promise的知識(shí)理解不足
把所有的promise裝起來(lái), 最后Promise.all包裹一下就行了

2018年6月9日 05:15