【问题标题】:How to call function at the very end of the submit event, after all callbacks are finished?在所有回调完成后,如何在提交事件的最后调用函数?
【发布时间】:2018-05-12 11:26:29
【问题描述】:

有人可以告诉我,在所有提交事件回调完成后如何调用该函数?我有类似的东西,但我需要在提交回调的最后。

$('#form').on('submit', function () {
    tour.next();
});

这个问题是,在这个之后触发的还有其他回调。再说一遍,如何在提交调用堆栈的最后添加处理程序?

【问题讨论】:

  • 事件回调是$('.xxx').on('click', function () { alert('callback one'); }); $('.xxx').on('click', function () { alert('callback two'); }); 你可以看到有回调。
  • 不要在 cmets 中发布对您的问题至关重要的代码(它不可读),而是将其编辑到您的问题中。

标签: javascript events dom-events submit


【解决方案1】:

如果tour.next();和其他回调是同步的,那么最后只调用setTimeout运行一个函数:

setTimeout(somethingToRunAtEnd);

它会在所有其他处理程序完成后运行。

如果它们是异步的,那么请确保它们返回 Promises,然后在它们上分别返回 Promise.all

let promises;
$('.xxx').on('click', function() {
  promises = [alert('callback one')];
});
$('.xxx').on('click', function() {
  promises.push(alert('callback two'));
  Promise.all(promises).then(() => {
    console.log('all asyncs finished');
  });
});

(相当老套,简单地分配一个处理程序而不是多个处理程序要好得多)

【讨论】:

  • 您确定 setTimeout 回调将在重定向之前完成吗?它不是在单独的调用堆栈中吗?我的意思是提交事件设置计时器并完成。但是计时器有自己的堆栈不是吗?
  • 在 setTimeout 回调完成之前提交触发器后看起来重定向。
  • 这样的话,submit 之后将没有任何空间容纳callback 3,因为页面将被替换 - 脚本将被终止。不,它不会进入单独的调用堆栈——它会被放在同一个(唯一)调用堆栈的末尾。
  • 如果我设置了没有第二个时间参数的计时器,它会被执行吗?因为它似乎不是。
  • 在提交处理程序中,您需要调用 preventDefault 以防止页面被替换 - 但是,您可以调用任何您想要的函数(同步或异步),它们会运行.
猜你喜欢
  • 2015-08-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-13
  • 2019-02-05
  • 2013-09-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多