Javascript write()不按顺序写入?

Javascript write()不按顺序写入?,javascript,node.js,Javascript,Node.js,我发现stream.writeable类的write()方法并没有按顺序写入数据。当我将am附件以块的形式发送到服务器时,如果没有发生延迟,则此代码将以错误的顺序组装数据块。如果我在循环中间设置了一个调试控制台,比如控制台。()(比如,转储数据来监视正在写入的内容),这个bug就消失了。那么,这个代码中的竞争条件是什么?看起来我正在强制执行文件的顺序组装,所以我不明白哪里出了问题 我的代码: function join_chunks(company_id,attachment_id,num_ch

我发现
stream.writeable
类的
write()
方法并没有按顺序写入数据。当我将am附件以块的形式发送到服务器时,如果没有发生延迟,则此代码将以错误的顺序组装数据块。如果我在循环中间设置了一个调试控制台,比如控制台。()(比如,转储数据来监视正在写入的内容),这个bug就消失了。那么,这个代码中的竞争条件是什么?看起来我正在强制执行文件的顺序组装,所以我不明白哪里出了问题

我的代码:

function join_chunks(company_id,attachment_id,num_chunks) {
    var stream;
    var file;
    var output_filename=ATTACHMENTS_PATH + '/comp' + company_id + '/' + attachment_id + '.data';
    var input_filename;
    var chunk_data;
    var chunk_count=0;
    stream=fs.createWriteStream(output_filename,{flags:'w+',mode: 0666});
    console.log('joining files:');
    for(var i=0;i<num_chunks;i++) {
        input_filename=ATTACHMENTS_PATH + '/comp' + company_id + '/' + attachment_id + '-' + (i+1) + '.chunk';
        console.log(input_filename);
        fs.readFile(input_filename , (err, chunk_data) => {
            if (err) throw err;
            stream.write(chunk_data,function() {
                chunk_count++;
                if (chunk_count==num_chunks) {
                    console.log('join finished. closing stream');
                    stream.end();
                }
            });
        });
    }   
}

节点版本:v6.9.2

流。写入
是一种异步操作。这意味着对它的多次调用可能会出现故障


如果希望写入操作按顺序进行,请使用
stream.writeSync
,或使用
stream.write
的回调参数对写入操作进行排序。

fs.readFile
是异步的;您可以立即将
num_chunk
文件操作排队,但它们不一定按照您排队的顺序完成。你可能要等到它们全部完成,然后把它们整理好并写下来。@qxz,好眼力。阅读是问题,而不是写作。我用顺序流代替了读数,一切都正常。如果你回答这个问题,我会接受的。另一个答案是错的。谢谢。文档中是否有说明writeable.write()方法的执行顺序不正确?或者您是在哪里读到的?据我所知,
可写的
流是为了顺序写入而创建的,因此,默认情况下,它应该在FIFO模式下保持顺序。@Nulik一般来说,节点中的所有系统调用都是异步的,除非文档明确另有说明。除了像回调这样的显式同步点之外,不保证异步调用的顺序。异步性与顺序的概念不同。您可以异步写入数据片段,但要保持它们的顺序。这就是为什么我想要一个对文档的清晰引用,而不是一个假设。@Nulik异步回调可以在任何时候调用,这意味着它们可以在任何时候完成。订单不能保证。
joining files:
/home/attachments/comp-2084830518/67-1.chunk
/home/attachments/comp-2084830518/67-2.chunk
/home/attachments/comp-2084830518/67-3.chunk
/home/attachments/comp-2084830518/67-4.chunk
join finished. closing stream