如何在具有可写Streams的循环中按顺序在Node中写入流?

时间:2015-11-18 03:27:50

标签: node.js stream fs

我想通过循环以特定的顺序在Node中将行附加到文件,这是一个可写的流。

以下是我所说的简化版本:

var fs = require('fs');
var outfile = fs.createWriteStream('outfile.txt');

for (var i = 0; i < 200; i++) {
    outfile.write('i', function (err, len) {
        console.log('written');
    });
}

我需要按顺序写入文件,这意味着它会按顺序写入12345...etc。我的理解是outfile.write是异步的,这意味着文件可能无序写入 - 这是正确的吗?

我从节点docs

中看到
  

请注意,在同一文件上多次使用fs.write而不等待回调是不安全的。对于这种情况,强烈建议使用fs.createWriteStream。

所以我认为使用流是最好的,但是,我不确定是否保证在继续循环中的下一次迭代之前成功写入数据块。我应该怎么做呢?感谢。

2 个答案:

答案 0 :(得分:0)

我认为对于当前的流和您在 2015 年拥有的流,写入从来都不是异步并行的。写入流在内存中有一个缓冲区,您可以写入该缓冲区而不是直接写入硬盘。缓冲区将使您的序列保持正确的顺序。

答案 1 :(得分:-2)

您可以使用fs.writeSync来避免使用fs.createWriteStream,而fs.write没有像var arr = [9, 12, 20, 23, 26]; var target = 35; var sigma = 5; var n = arr.length; // sort the numbers in ascending order arr.sort(function(a,b){return a-b;}); // initialize the recursion var stack = [[0,0,[]]]; while (stack[0] !== undefined){ var params = stack.pop(); var i = params[0]; // index var s = params[1]; // sum so far var r = params[2]; // accumulating list of numbers // if the sum is within range, output sum if (s >= target - sigma && s <= target + sigma){ console.log(r); break; // since the numbers are sorted, if the current // number makes the sum too large, abandon this thread } else if (s + arr[i] > target + sigma){ continue; } // there are still enough numbers left to skip this one if (i < n - 1){ stack.push([i + 1,s,r]); } // there are still enough numbers left to add this one if (i < n){ _r = r.slice(); _r.push(arr[i]); stack.push([i + 1,s + arr[i],_r]); } } /* [9,23] */

这样的回调问题