【问题标题】:Attach a callback on click of a button which does an ajax operation单击执行 ajax 操作的按钮时附加回调
【发布时间】:2019-02-28 00:39:16
【问题描述】:

我知道这可以通过 Promise 实现,但我正在努力弄清楚如何。

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'})),因为它可能没有获得应有的 Promise 状态并立即被标记为 Resolved 从而执行回调而不等待? 我尝试在 .saveBtn 中返回 doAjax,但这也没有什么不同。

请出主意。

【问题讨论】:

  • 是的,我已经想到了,但是点击保存时会发生很多逻辑,这也需要在点击链接时完成,有没有办法以某种方式使触发器成为承诺?

标签: javascript jquery promise .when


【解决方案1】:

问题是因为trigger() 不是异步函数,所以会立即调用then。直接通过点击.link 调用doAjax() 而不是伪造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;
  }
});

【讨论】:

  • 为了简单起见,我在问题中缩短了这些事件处理程序,但每个处理程序中都有很多逻辑。
  • 好的,函数中的逻辑数量会影响什么吗?您需要遵循的模式仍然相同。
  • 我在想return doAjax() 里面的.saveBtn 是否可以做到这一点?或者改用triggerHandler
  • 不,您不能从事件处理程序返回任何内容。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-12-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-15
  • 1970-01-01
相关资源
最近更新 更多