javascript - 迭代目录的最有效方法是什么?

标签 javascript asynchronous promise

假设我有一个目录 foo,其中有一些子目录。这些子目录中的每一个都有 0 到 5 个我想要处理的可变长度文件。我的初始代码如下所示:

    pool.query(`
      SET SEARCH_PATH TO public,os_local;
    `).then(() => fs.readdirSync(srcpath)
        .filter(file => fs.lstatSync(path.join(srcpath, file)).isDirectory())
        .map(dir => {
          fs.access(`${srcpath + dir}/${dir}_Building.shp`, fs.constants.R_OK, (err) => {
            if (!err) {
              openShapeFile(`${srcpath + dir}/${dir}_Building.shp`).then((source) => source.read()
.then(function dbWrite (result) {
              if (result.done) {
                console.log(`done ${dir}`)
              } else {
    const query = `INSERT INTO os_local.buildings(geometry,
                  id,
                  featcode,
                  version)
                  VALUES(os_local.ST_GeomFromGeoJSON($1),
                  $2,
                  $3,
                  $4) ON CONFLICT (id) DO UPDATE SET
                    featcode=$3,
                    geometry=os_local.ST_GeomFromGeoJSON($1),
                    version=$4;`
                return pool.connect().then(client => {
                  client.query(query, [geoJson.split('"[[').join('[[').split(']]"').join(']]'),
                    result.value.properties.ID,
                    result.value.properties.FEATCODE,
                    version
                  ]).then((result) => {
                    return source.read().then(dbWrite)
                  }).catch((err) => {
                    console.log(err,
                      query,
                      geoJson.split('"[[').join('[[').split(']]"').join(']]'),
                      result.value.properties.ID,
                      result.value.properties.FEATCODE,
                      version
                    )
                    return source.read().then(dbWrite)
                  })
                  client.release()
                })
              }
            })).catch(err => console.log('No Buildings', err))
            }
          })

          fs.access(`${srcpath + dir}/${dir}__ImportantBuilding.shp`, fs.constants.R_OK, (err) => {
            //read file one line at a time
            //spin up connection in pg.pool, insert data
          })

          fs.access(`${srcpath + dir}/${dir}_Road.shp`, fs.constants.R_OK, (err) => {
            //read file one line at a time
            //spin up connection in pg.pool, insert data
          })

          fs.access(`${srcpath + dir}/${dir}_Glasshouse.shp`, fs.constants.R_OK, (err) => {
            //read file one line at a time
            //spin up connection in pg.pool, insert data
          })

          fs.access(`${srcpath + dir}/${dir}_RailwayStation.shp`, fs.constants.R_OK, (err) => {
            //read file one line at a time
            //spin up connection in pg.pool, insert data
          })
        })

这大部分是可行的,但最终必须等待最长的文件在每个子目录中被完全处理,导致实践中始终只有 1 个到数据库的连接。

有没有一种方法可以重新设计它以更好地利用我的计算资源,同时限制事件 postgres 连接的数量并强制代码等待连接可用? (我在 node-postgres 的 pg poolConfig 中将它们设置为 20)

最佳答案

如果您需要在一定时间内轮流处理您的文件,那么您可以使用Streams。 ,定时器(用于调度)和 process.nextTick()。 有 great manual用于理解 nodejs 中的流。

关于javascript - 迭代目录的最有效方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44619434/

相关文章:

ios - 如何在 Swift 2.0 中获取以分钟为单位的时差

javascript - 异步完成后如何执行另一个功能?

javascript - 在 promise 中中止 ajax 请求

javascript - d3 javascript中的变量范围

javascript - Javascript 更改元素 CSS 后媒体查询无法正常工作

C# 异步套接字 BeginSend

c# - 在 c# 5.0 中, "async/await"函数是否总是在运行开始时在主线程上运行

javascript - promise 数组和 Promise.all()

javascript - 触发TinyMce文件上传

JavaScript 无法在 'appendChild' 上执行 'Node' 参数 1 不是类型 'Node'