Javascript-форум (https://javascript.ru/forum/)
-   ExtJS (https://javascript.ru/forum/extjs/)
-   -   Не выполнять код до ответа (https://javascript.ru/forum/extjs/49632-ne-vypolnyat-kod-do-otveta.html)

maksimka2112 21.08.2014 18:01

Не выполнять код до ответа
 
Сегодня возникла такая проблема: необходимо получить таблицу, данные для формирования столбцов приходят либо с сервера, либо с экрана. Получается так, что прежде чем придут данные, формируется таблица.

var my_data=get_my_data(); // по этой ф-ции идёт обращение к серверу и в ответ приходит необходимая информация
alert('Этот алерт выполнится раньше, чем запишется информация в переменную my_data');


Что можно сделать, чтобы сначала записалась переменная my_data ?

Aetae 21.08.2014 18:35

Ничего. Делается это так:
function get_my_data(callback){
// по этой ф-ции идёт обращение к серверу 
    обращение.onsuccess = function(результат){
        var my_data = результат;
        callback(my_data);
    }
}

function first(){
//первая часть кода
    get_my_data(second)
}

function second(my_data){
//вторая часть кода
}

first();

maksimka2112 22.08.2014 20:36

Aetae,
Спасибо! Буду знать, что есть такой способ. Правда сделал по-другому, выяснив, что в ексте 3 нельзя указать синхронный метод загрузки. В общем я подключил prototype.js, а там всё элементарно - asynchronous: false

Aetae 25.08.2014 00:25

Синхронные запросы небезосновательно считаются злом. Страница при таком запросе полностью перестаёт отвечать на то время пока идёт загрузка. Пользователей обычно такое поведение бесит.

maksimka2112 26.08.2014 19:38

Цитата:

Сообщение от Aetae (Сообщение 327324)
Синхронные запросы небезосновательно считаются злом. Страница при таком запросе полностью перестаёт отвечать на то время пока идёт загрузка. Пользователей обычно такое поведение бесит.

Да это понятное дело. Но что же поделать, если синхронным запросом я записываю данные во временную таблицу, а затем извлекаю уже записанные данные? Если код будет выполняться дальше, то информация не будет считана, так как insert-то ещё не выполнен! А значит и commit в бд не сработал и т.д. Короче говоря, Восток-дело тонкое)

Aetae 26.08.2014 21:10

Что делать - подождать пока выполнится, не завешивая при этом страницу намертво. Для этого и существуют асинхронные запросы. Зависшие страницы плохо воспринимаются пользователями. У них должна быть возможность передумать и кликнуть на другой раздел например. Таки не понятно, что вы все находите сложного в том, чтобы не писать весь код подряд, а разделить его логически на функции, каждая из которых будет вызвана именно тогда когда надо?

maksimka2112 27.08.2014 20:03

Цитата:

Сообщение от Aetae (Сообщение 327658)
У них должна быть возможность передумать и кликнуть на другой раздел например. Таки не понятно, что вы все находите сложного в том, чтобы не писать весь код подряд, а разделить его логически на функции, каждая из которых будет вызвана именно тогда когда надо?

При входе в задачу пользователи выбирают условия формирования, по ним данные записываются во временную таблицу, затем из неё выбираются неповторяющиеся атрибуты - цеха - которые будут являться столбцами (то есть переменное число столбцов). Для того, чтобы узнать количество стобцов, чтобы не шла дальнейшая загрузка кода, ибо пока неизвестно какую таблицу строить, я и хочу использовать синхронный запрос! В данном случае использование множества функций возможно, но нецелесообразно, ибо обращений к серверу в процесс е загрузки, подобных описанному, много. Но ваш способ мне понравился и впредь буду стараться его использовать.


Часовой пояс GMT +3, время: 20:32.