首页 > 解决方案 > 无法处理承诺中的错误

问题描述

我有这个函数,它采用路径并获取一些关于它的信息(使用 node.js 功能)

代码

import fs from 'fs'
import fse from 'fs-extra'
import { join } from 'path'


/**
 * Take in file path and return contents with stat
 * @param  {String} path
 * @return {Array}
 */
export default path => {
  return readdir(path).then(files => {
    const statsPromises = files.map((file, i) => {
      const p = join(path, file)
      return stat(p).then(stat =>
        ({
          // THIS ONE LINE BELOW THROWS UN-HANDLED ERRORS FOR SOME PATHS
          // Error: EPERM: operation not permitted, scandir
          folderItemsCount: stat.isDirectory() ? fs.readdirSync(p).length : null,
          name: file,
          path: p,
          stat
        })
      , err => console.log("Path access error ", err))
    })
    return Promise.all(statsPromises)
  }).then(contents =>
    contents.filter(Boolean)
  )
}


// ============== HELPER FUNCTIONS ==============
/**
 * Get Array for path contents. Checks if path exists
 * @param  {String} path
 * @return {Promise}
 */
export function readdir (path) {
  return pathExists(path)
    ? fse.readdir(path)
    : Promise.reject(new Error('Path does not exist'))
}

/**
 * Alias of fse.existsSync
 * @param  {String} path
 * @return {Boolean}
 */
export function pathExists (path) {
  return fse.existsSync(path)
}

/**
 * Get path stat
 * @param  {String} path
 * @return {Promise}
 */
export function stat (path) {  
  return fse.stat(path)
}

问题

我不知道如何处理以下行的错误:

folderItemsCount: stat.isDirectory() ? fs.readdirSync(p).length : null

我希望它:

下面的行处理stat()但不是scandir()

, err => console.log("Path access error ", err))

标签: javascript

解决方案


无需深入研究您的代码,promise 要么解决要么拒绝,您的处理程序要么点击“then”或“catch”。我看到您使用的是 .then,但不是 .catch。还要记住,如果该列表中的任何承诺被拒绝,Promise.all 将拒绝,所以你在那里有一个全有或全无的承诺。


推荐阅读