2016-07-27 42 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():在循環的外面和循環內的promise的重新分配?你在循環中返回一個承諾是什麼? – easymoden00b

+0

'Promise.all([x1,x2,x3])'(您的代碼)是併發的,x1,x2和x3例程將同時運行。我的答案中的代碼最終做的是'Promise.resolve()。then(x1).then(x2).then(x3)'。 'Promise.resolve()'初始化de promise鏈,然後每個promise只在前一個promise完成時執行。 – Pandaiolo

+0

好的,謝謝我明白,但不會同時使用sources.forEach(){}操作嗎? – easymoden00b