fs.appendFile没有按顺序附加数据?

时间:2015-05-26 02:16:04

标签: javascript node.js

以下代码的作用是从文件夹中获取几个文本文件并将它们附加到文件中:

#!/usr/bin/env node

'use strict'

const fs = require('fs')
    , input = process.argv[2]

if (process.argv.length < 3) {
  console.log('Usage: node ' + process.argv[1] + ' FILENAME')
  process.exit(1)
}

fs.readdir(__dirname + `/${input}/`, (err, files) => {
  if (err) {
    return
  }

  files.forEach((file, index) => {
    fs.readFile(__dirname + `/${input}/` + file, 'utf8', (err, data) => {
      let result

      if (err) {
        console.log(err)
      }

      if (index == files.length - 1) {
        result = `${data}`
      } else {
        result = `${data}\n`
      }

      fs.appendFile("merged.txt", result, (err) => {
        if (err) {
          console.log(err)
        } else {
          console.log(result)
        }
      })
    })
  })
})

所以,我要说我有一个名为docs的文件夹,里面有doc1.txt,doc2.txt,doc3.txt with the content ## Doc 1,## Doc 2,和## Doc 3 respectively. The code would produce a single file called merged.txt`与内容:

## Doc 1

## Doc 2

## Doc 3

没关系。但有时订单是错误的。我会得到类似的东西:

## Doc 1

## Doc 3

## Doc 2

特别是当文件很多时。

如何修改代码以防止出现此问题?

1 个答案:

答案 0 :(得分:1)

您可以将fs.appendFile更改为fs.appendFileSync(快速而肮脏,但不是最佳解决方案),或者您可以使用eachSeries async方法系列地运行事件} module(https://www.npmjs.com/package/async#eachSeries)。