Использовать ".then" из JqueryAJAX для "нормальной" функции? - PullRequest
0 голосов
/ 29 августа 2018

Ситуация выглядит следующим образом:

$("#someThing").datepicker({
  //someOptions,
  onSelect: function() {
    /*Does some async stuff*/
    AJAXCALL();
    /*execute AFTER ajaxcall has finished*/
    foo();
  }
})


function AJAXCALL() {
  $.post('someUrl.php', {
    //nothing to transmit
  }, someFunction(data))
}

Дело в том, что приводит к каскаду функций, которые обрабатывают DataFromTheDatabase. Код внутри этого каскада либо синхронный, либо внутри есть секции async / await, которые правильно синхронизируют код.

В конечном итоге, и начальная AJAXCALL(), и последующие функции ДОЛЖНЫ завершиться до выполнения foo().

Было бы достаточно сделать следующее:

$("#someThing").datepicker({
  //someOptions,
  onSelect: function() {
    AJAXCALL().then(() => {
      foo()
    })
  }
})


function AJAXCALL() {
  return $.post('someUrl.php', {
    //nothing to transmit
  }).then((data) => someFunction(data))
}

Ответы [ 2 ]

0 голосов
/ 29 августа 2018

С текущей версией jQuery уже достаточно написать ее, как вы делали во втором примере:

$("#someThing").datepicker({
  //someOptions,
  onSelect: function() {
    AJAXCALL().then(() => {
      foo()
    })
  }
})


function AJAXCALL() {
  return $.post('someUrl.php', {
    //nothing to transmit
  }).then((data) => someFunction(data))
}

Итак, someFunction будет вызван до вызова foo.

И вам не нужно писать .then((data) => someFunction(data)), вместо этого вы можете просто написать .then(someFunction). То же самое с foo:

$("#someThing").datepicker({
  //someOptions,
  onSelect: function() {
    AJAXCALL().then(foo)
  }
})


function AJAXCALL() {
  return $.post('someUrl.php', {
    //nothing to transmit
  }).then(someFunction)
}
0 голосов
/ 29 августа 2018

Используйте тогда, когда https://api.jquery.com/jquery.when/

$("#someThing").datepicker({
  //someOptions,
  onSelect: function() {
    $.when( AJAXCALL() ).then(() => {
      foo()
    })
  }
})


function AJAXCALL() {
  return $.post('someUrl.php', {
    //nothing to transmit
  }).then((data) => someFunction(data));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...