#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. Я попытался вставить строку для удаления кэша, но она тоже не работает