Прикрепить обратный вызов по нажатию кнопки, которая выполняет операцию AJAX - PullRequest
0 голосов
/ 24 сентября 2018

Я знаю, что это может быть достигнуто через Обещание, но я изо всех сил пытаюсь выяснить, как.

jQuery('.parentDiv').on('click', '.link', function(e) {
  jQuery.when(jQuery('.saveBtn').trigger('click', { 'evtData': 'link' })).then(function {
    // rest of the logic that should be performed on click of .link
  }); 
});

Щелчок .saveBtn вызывает функцию с именем doAjax:

jQuery('.saveBtn').on('click', function() {
  doAjax()
});

function doAjax() {
  var ajaxCall = jQuery.ajax(ajaxObject);
  ajaxCall.done(function(data, status, xhr) {
    //some logic go here
  });
  return ajaxCall;
}

Несмотря на это, логика внутри обработчика .then выполняется сначала, т.е. до завершения doAjax.

Я считаю, что мне нужно изменить jQuery.when(jQuery('.saveBtn').trigger('click',{'evtData':'link'})), так как он может не получитьОбещать состояние, которое он должен, и сразу же помечается как решенный, тем самым выполняя обратный вызов без ожидания ?.Я попытался вернуть doAjax в .saveBtn, но это также не имело значения.

Идеи, пожалуйста.

1 Ответ

0 голосов
/ 24 сентября 2018

Проблема в том, что trigger() не является асинхронной функцией, поэтому then вызывается немедленно.Гораздо разумнее просто звонить по номеру doAjax(), нажимая .link, а не подделывать события DOM.Попробуйте это:

jQuery(function($) {
  $('.parentDiv').on('click', '.link', function(e) {
    doAjax().then(function {
      // rest of the logic that should be performed on click of .link
    });
  });

  $('.saveBtn').on('click', function() {
    doAjax()
  });

  function doAjax() {
    var ajaxCall = $.ajax(ajaxObject);
    ajaxCall.done(function(data, status, xhr) {
      // some logic go here
    });
    return ajaxCall;
  }
});
...