#javascript #callback #extjs4 #store
#javascript #обратный вызов #extjs4 #Магазин
Вопрос:
Не могли бы вы помочь мне взглянуть на приведенные ниже коды? Почему я не могу получить значение вне обратного вызова?
Любые комментарии будут оценены.
var i = 0;
var myModulesName = [];
me.store.load({callback: function(){
me.store.data.each(function(records) {
if(records.raw.hasLeaf === true){
//Ext.Function.defer(function() {
myModulesName[i] = records.raw.name;
console.log('this is constructor App.js inside storeload ' myModulesName[i]);
//}, 100, me);
i;
}
});
}
});
//empty here.
console.log('this is constructor outside of load ' myModulesName);
Ответ №1:
Да, оно пустое и останется пустым, потому store.load()
что оно асинхронное. Запрос отправляется на сервер, и выполнение немедленно продолжается. Когда сервер возвращает ответ (это может занять несколько секунд), выполняется обратный вызов, и, если запрос был успешным, запускается событие загрузки.
Комментарии:
1. Спасибо, Саки! Как я мог бы получить myModulesName вне обратного вызова load? Я даже пробовал установить async:false в определении моего хранилища, ничего не изменилось.
2. Я не знаю, каким должен быть конечный результат. Если вам нужен только массив значений, полученных с сервера, вам может вообще не понадобиться хранилище. Хранилища должны предоставлять источник данных для сеток, деревьев, комбинаций для фильтрации, сортировки и т.д. Если вам это не нужно, просто отправьте
Ext.Ajax.request
, расшифруйте результат, и все готово.3. Мне действительно нужно фильтровать, сортировать по моему древовидному меню. Боюсь, мне придется это выяснить. Кто-то сказал, что использует callback.call в функции getJSON в другом потоке. Это не будет работать для store.load.
4. Я не знаю, чего вы ожидаете. Загрузка хранилища является асинхронной, поэтому вам необходимо поместить всю обработку, для которой требуются данные с сервера, в успешный обратный вызов.
5. Спасибо, Саки. Мне нужно передать данные в переменную во время процесса загрузки, и после его успешного завершения я могу получить данные вне load.
Ответ №2:
Этот фрагмент кода находится в функции конструктора, и у меня есть другая функция, вызываемая init(), которая будет запущена после конструктора. И приведенные ниже коды находятся в конце моего конструктора.
if (Ext.isReady) {
Ext.Function.defer(me.init, 10, me);
} else {
Ext.onReady(me.init, me);
}
Я просто переместил эту часть в load() и в конце «каждой» части, и это сработало! Теперь я могу получить modulesName.