2016-05-31 3 views
0

У меня есть итерации в for цикл по количеству файловЧтение нескольких файлов синхронно в Javascript с использованием FileReader

Я должен прочитать первую строку каждого файла и добавить его, скажем, на карте, имеющей имя файла в качестве ключа и Первая строка этого файла в качестве значения.

Я использую FileReader, чтобы прочитать файл, но он асинхронный.

Когда я открываю поток для чтения файла, цикл увеличивается до того, как я закончил чтение файла и добавление нужной записи на карту.

Мне нужна синхронная операция. Прочитайте первую строку, добавьте ее на карту, а затем увеличьте цикл и перейдите к следующему файлу.

for (var i = 0; i < files.length; i++){ 

    var file = files[i]; 

    var reader = new FileReader(); 

    reader.onload = function(progressEvent){ 
    var lines = progressEvent.target.result.split('\n'); 
    firstLine = lines[0]; 
    alert('FirstLine'+firstLine); 
    //add to Map here 
    } 

    reader.readAsText(file); 
} 

Как изменить код, чтобы достичь вышеупомянутых функциональных возможностей.

+0

Для синхронизации процесса вы можете использовать '' recursion' или обещание chain' – Rajesh

+0

@Rajesh могли бы вы помочь мне с этим, я не про работы с JS. – Abhishek

+0

вы можете попробовать что-то вроде этого: [JSFiddle] (https://jsfiddle.net/xw3cbcyo/). Это пример кода. – Rajesh

ответ

2

Вы можете использовать обещания и позволить им работать в порядке их создания с помощью reduce.

Приведенный ниже код показывает, как это можно сделать таким образом, и вы можете взглянуть на этот простой JSFiddle, который демонстрирует идею.

//create a function that returns a promise 
function readFileAndAddToMap(file){ 
    return new Promise(function(resolve, reject){ 
     var reader = new FileReader(); 
     reader.onload = function(progressEvent){ 
      var lines = progressEvent.target.result.split('\n'); 
      firstLine = lines[0]; 
      console.log('FirstLine'+firstLine); 
      //add to Map here 
      resolve(); 
     } 

     reader.onerror = function(error){ 
      reject(error); 
     } 

     reader.readAsText(file); 
    }); 
} 

//create an array to hold your promises 
var promises = []; 
for (var i = 0; i < files.length; i++){ 
    //push to the array 
    promises.push(readFileAndAddToMap(files[i])); 
} 

//use reduce to create a chain in the order of the promise array 
promises.reduce(function(cur, next) { 
    return cur.then(next); 
}, Promise.resolve()).then(function() { 
    //all files read and executed! 
}).catch(function(error){ 
    //handle potential error 
}); 
+0

Это привело меня на правильный путь, спасибо. – tetris11