2016-07-27 1 views
0

バイナリファイルの特定のセグメントを取得し、圧縮した形式に再結合しようとしています。しかし、このタスクが完了すると、バイナリデータはセミランダムな順序でスクランブルされる。実際には、最初のおよそ15kバイトが正しければ、その後にコンフリクトが連続して発生します。何がうまくいかないのですか?私は、これらのストリームが(より良いメタファの欠如のために)お互いに走っていると信じて、結果のバイトの長さは正しいです。なぜこうなった?私は非同期性に関して十分な注意を払っていると思った?読み込み/書き込みストリームを使用してバイナリファイルを正しく解析および再構成できない

    var destinationPath = something.bin; 
       Promise.all(sources.map(function (source) { 
        return new Promise(function (resolve, reject) { 
         var output = fs.createWriteStream(destinationPath, {'flags': 'a', 'bufferSize': 64 * 4096}); 
         var input = fs.createReadStream(source.filePath, { 
          start: source.parameters.start, 
          end: source.parameters.end + 3 
         }); 
         input.on('end', function() { 
          output.on('finish', function() { 
           resolve(); 
          }); 
         }); 
         input.pipe(output); 
        }); 
       })); 

答えて

1

この影響があるかどうかはわかりませんが、順番にお試ししましたか?同じファイルに複数の書き込みストリームを同時に作成します。例えば

   var destinationPath = something.bin; 
      var promise = Promise.resolve(); 
      sources.forEach(function (source) { 
       promise = promise.then(funtion() { 
       return new Promise(function (resolve, reject) { 
        var output = fs.createWriteStream(destinationPath, {'flags': 'a', 'bufferSize': 64 * 4096}); 
        var input = fs.createReadStream(source.filePath, { 
         start: source.parameters.start, 
         end: source.parameters.end + 3 
        }); 
        input.on('end', function() { 
         output.on('finish', function() { 
          resolve(); 
         }); 
        }); 
        input.pipe(output); 
       }); 
       }); 
      }); 

      promise.then(function() { 
       // we're done here 
      }); 
+0

私はあなたのコードを理解していません。これは同時に実行されませんか?なぜPromise.resolve():ループの外にあり、ループの中で約束を再割り当てしますか?あなたはループ内の約束を返すのですか? – easymoden00b

+0

'Promise.all([x1、x2、x3])'(あなたのコード)は同時に実行され、x1、x2、x3ルーチンは同時に実行されます。私の答えのコードは最終的に 'Promise.resolve()。then(x1).then(x2).then(x3)'です。 'Promise.resolve()'はpromise chainを初期化し、それ以後は全ての約束が実行されます。 – Pandaiolo

+0

よろしくお願いいたします。私は理解していますが、sources.forEach(){}は並行して動作しませんか? – easymoden00b

関連する問題