JQuery: Как добиться последовательного выполнения?

Есть следующий код, по нажатии на x-кнопку вызывается функция process. Функция load выполняет запрос к файлу php, который возвращает JSON-объект.

function load() {
    $.post("engine/loadC.php", {fileName : "key.txt"}, function(data) {        
            key = JSON.parse(data);
    });
}
function process() {
    load(); 
    alert(window.key);
    /* последующий код */
}


Проблема заключается в том, что при первом клике на x-кнопку, alert выводит undefined. При втором клике уже выводит массив значений, тот самый требующий результат. Понятно, что имею дело с асинхронностью... Как добиться того, чтобы alert(window.key) и последующий код выполнялись только после выполнения load() ?
  • Вопрос задан
  • 12862 просмотра
Решения вопроса 2
а еще лучше так:
function load() {
    return $.post("engine/loadC.php", {fileName : "key.txt"}, function(data) {        
            key = JSON.parse(data);
    });
}

function process() {
    load().then(function(){
      alert(window.key);
    }); 
    /* последующий код */
}

если несколько аякс запросов можно так
function loadKey() {
  return $.post("engine/loadC.php", {fileName : "key.txt"}, function(data) {        
    key = JSON.parse(data);
  });
}
function loadValue(){
  return $.post("engine/loadC.php", {fileName : "value.txt"}, function(data) {        
    value = JSON.parse(data);
  });
  
}
function process() {
  $.when(loadvalue(), loadKey()).then(function(){
    alert(window.key);
  } 
}

если принципиально делать аякс запросы в одной функции:
function load() {
  var $def = new $.Deferred;

  $.post("engine/loadC.php", {fileName : "key.txt"}, function(data) {        
    key = JSON.parse(data);
  }).then(function(){
    $.post("engine/loadC.php", {fileName : "value.txt"}, function(data) {        
      value = JSON.parse(data);
      $def.resolve();
    });
  })

  return $def;
}

function process() {
  load().then(function(){
    alert(window.key);
  } 
}
Ответ написан
Комментировать
smoked
@smoked
function load() {
    $.post("engine/loadC.php", {fileName : "key.txt"}, function(data) {        
            key = JSON.parse(data);
            aftercode();
    });
}
function process() {
    load(); 
   
}

function aftercode() {
    alert(window.key);
    /* последующий код */
}
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 3
Установите async: false в настройках ajax запроса к серверу. что-то вроде того
function load() {
    var key;
    $.ajax({
        url: 'engine/loadC.php',
        data: {'filename': 'key.txt'},
        async: false,
        type: 'post',
        dataType: 'json',
        success: function(data) {
            key = json.parse(data);
        }
    });
    return key;
}
function progress() {
    load();
    alert(window.key);
}
Ответ написан
metamorph
@metamorph
Связать асинхрон и синхрон просто так не получится.
Либо паковать логику в асинхронное что-нибудь, либо ждать по таймеру.

Пример: по нажатии кнопки вызывать не process(), а load(), а вызов process перенести в success хендлер.
Ответ написан
Комментировать
function load() {
    $.post("engine/loadC.php", {fileName : "key.txt"}, function(data) {        
            key = JSON.parse(data);
           alert(window.key);
    });
}
function process() {
    load(); 
    
    /* последующий код */
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы