Чтение файлов в JavaScript с помощью Phonegap

#javascript #file #cordova #closures

#javascript #файл #кордова #замыкания

Вопрос:

У меня есть таблица объектов (x, y, z, …), каждый из которых содержит путь к файлу и идентификатор. И их собственные методы: getPath() и getId() .

Итак, я хочу прочитать каждый файл и сохранить данные в элементе html, на который указывает идентификатор.

Но когда я это делаю:

 function readFile(path, callback, context)
{
 var reader = new FileReader();
 r.readAsText(path);
 // here if I display the objects, I've got in order x,y,z,....
 r.onloadend = function ()
               {
                  // Here is the problem
                  // If x and y has the same "path" attribute value
                  // I've got in order : y,y,z ....
                  callback(r.result, context); 
               } 
}

function main(tabObject)
{
 for (var i = -1;   i < tabObject.length;)
  {
     readFile(tabObject[i].getPath(),
              function (result, context)
               {
                  // Doing stuff with the result
                  console.log("the id of the html tag is : "   context.getId());
                  console.log("this is what I read"   result);
               },
               tabObject[i]);

  }
}
  

Это работает, если все пути к файлам разные. Но, например :

Если два первых объекта (‘x’ и ‘y’) имеют одинаковое значение path (like C://Directory/stuff.png ).

r.onloadend Функция будет вызываться дважды с одним и тем же объектом (дважды с y ). Я думаю, это потому, что для второго чтения (для ‘y’) функции не требуется больше времени для чтения файла (уже прочитанного с помощью ‘x’), и поэтому в «стеке вызовов» y будет удален x (закрытие функции, вероятно, не очень хорошо).

Я надеюсь, что кто-нибудь сможет объяснить мне, что происходит, и как это исправить.

Я нашел «решение», на самом деле я использую функцию «setInterval» для разделения каждого времени чтения на 100 миллисекунд. Хорошо, это работает, но это решение очень, очень уродливое, и поэтому я оставляю этот пост, пока кто-нибудь не скажет мне, что происходит…

Комментарии:

1. Вы пробовали помещать строку для удаления кэша в конец имени файла — что-то вроде «c://Directory/stuff.png?123123 » … просто случайные числа

2. Я попытался вставить строку для удаления кэша, но она тоже не работает