Почему мои функции не работают в ожидаемом порядке?

Недавно, что я начал разрабатывать Веб приложение и столкнулся со следующей проблемой:

var template = {};
template = (function () {

var ROWS = -1;
var COLS = -1;

var _set = function (position) {
    jQuery.ajax({
        type: "GET",
        url: pathservicehost + '/posiciones/' + position,
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        success: function (data, status, jqXHR) {
            ROWS = data.TotalFila;
            COLS = data.TotalColumna;
        },
        error: function (jqXHR, status) {
        }
    });

    if (PARAMETERS != null && ROWS > 0 && COLS > 0)
        _create(container);
};

var _create = function (container) {
    //Crea una tabla y lo coloca en 'container' usando las variables  globales ROWS y COLS
};

var _init = function (container, position) {
    _set(position);
    _create(container);
};

return {
    init: _init
}
})();

Проблема, которая у меня есть, - что, когда я призываю в функцию init, функция _create он работает нежели _set и ввиду того, что стоимость переменных COLS и ROWS не инициализировалась еще, программа бросает в меня исключение.

Я хотел бы, чтобы пожалуйста кто-то ориентировал меня относительно, как он мог бы решать вышеупомянутую проблему, спасибо.

1
задан 24.03.2016, 08:13
2 ответа

Проблема, которая у меня есть, состоит в том, что, когда я призываю в нее funciГіn init, она funciГіn _create он работает нежели _set, и ввиду того, что стоимость переменных COLS и ROWS не инициализировалась aГєn, программа бросает одну в меня excepciГіn.

В действительности, _set работает сначала, но не забывай о том, что язык сценариев JavaScript - монозадание и асинхронный для всех операций Ввода / вывода, и внутри _set ты делаешь запрос ajax. Такие

Как запрос Аякс - запрос о вводе / выводе тебя не может называть _create последовательно в mГ©todo _set, ты должен делать это, когда он заканчивает ее operaciГіn, а именно, в "callback", который ты перемещаешь его в jQuery..., так как он будет призван, когда данные будут получены.

В cГіdigo, призывает _create внутри callback success: (больше комментариев в cГіdigo)

// a set le pasas el container pues lo necesitaras cunado invoques _create
var _set = function (container, position) {
    jQuery.ajax({
      // resto del codigo
      success: function (data, status, jqXHR) {
        ROWS = data.TotalFila;
        COLS = data.TotalColumna;

        // aquí invocas a _create, cuando ya tienes los datos.
        _create(container);
      },
      // resto del codigo
}

Потом, когда ты призываешь _set

var _init = function (container, position) {
    _set(container, position);
};

Глаз! fГ-jate, что в _set, я добавил порядок переменных для того, чтобы у него была консистенция cГіdigo.

часть, которую он продолжает, ты можешь удалять, не сомневаясь в этом, так как в этой точке также не прибыл ответ сервера

if (PARAMETERS != null && ROWS > 0 && COLS > 0)
        _create(container);

В конце концов чтобы упрощать вещи, можешь удалять mГ©todo _init и называть _set как _init, так как Гєnico, которая делает, состоит в том, чтобы призывать _set

Из комментариев

, Если ты должен делать несколько запросов и координировать их, я рекомендую тебе изучать Обещания (в inglГ©s Promises). AquГ - я оставляю тебе ссылку, которая обрабатывает информацию различий между callbacks и Promises:

Различий между укрытыми AJAX и promises

2
ответ дан 24.11.2019, 14:41
  • 1
    большое спасибо из-за твоего ответа и советов они мне казались достаточно логическими и давали мне лучшее понимание моей проблемы. То, что мне хотелось бы знать, состоит в том, что оно произошло бы, если бы в функции _set он имел по отношению к большему количеству призывов к серверу (а именно он завершает не только услугу а некоторые) необходимые все их, чтобы инициализировать переменные, которые позже он использует в функции _create – alexander zevallos 23.03.2016, 23:52
  • 2
    @alexanderzevallos в этом случае, tendr и # 225; s, что делать второй запрос, когда он заканчивает первую, или использовать promises (что я рекомендую тебя, изучи), чтобы координировать все запросы. Нет формы, из которой ты мог бы делать это как в языках, что " bloquean" когда ты читаешь файл или ресурс сети. Ты должен использовать всегда callbacks, это закон javascript. – rnrneverdies 23.03.2016, 23:55
  • 3
    @alexanderzevallos обрати внимание, что я оставил соединение в ответе на promises. – rnrneverdies 23.03.2016, 23:59
  • 4
    Спасибо за советы снова @rnd... есть слишком много вещей, которых даже мне не хватает из-за того, что изучает. Я приму во внимание твой совет относительно promises. – alexander zevallos 24.03.2016, 00:00
  • 5
    @alexanderzevallos ничего! пробуя он изучается! удача!, конечно ты не можешь помечать оба ответов, как правильные, ты должен elejir одну, это закон SO. jaja.! удача! – rnrneverdies 24.03.2016, 00:01

Я думаю, что он, потому что она funciГіn _set - asГ-ncrona. Сначала он делает заказ в сервер, и когда они направляют данные, работает то, что есть внутри .success. (Эта devoluciГіn с того, чтобы опаздывать немного и поэтому, выполняет _create так, что

не ждет ответ _set) В моем случае, использовании две формы, чтобы это решать, я призываю _create внутри .success или использую callback.

PodГ©s добавлять callback с чем-то как это:

var template = {};
template = (function () {

var ROWS = -1;
var COLS = -1;

var _set = function (position, callback) {
    jQuery.ajax({
        type: "GET",
        url: pathservicehost + '/posiciones/' + position,
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        success: function (data, status, jqXHR) {
            ROWS = data.TotalFila;
            COLS = data.TotalColumna;

            callback();
        },
        error: function (jqXHR, status) {
        }
    });

    if (PARAMETERS != null && ROWS > 0 && COLS > 0)
        _create(container);
};

var _create = function (container) {
    //Crea una tabla y lo coloca en 'container' usando las variables  globales ROWS y COLS
};

var _init = function (container, position) {
    _set(position, function(){
            _create(container);
        });

};

return {
    init: _init
}
})();
1
ответ дан 24.11.2019, 14:41
  • 1
    Спасибо за твой ответ @KN_... я потрачу какие-то часы читая м и # 225; s относительно callbacks. – alexander zevallos 23.03.2016, 23:59