ExtJS.data.store.загрузить пустое значение вне обратного вызова

#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.