为了账号安全,请及时绑定邮箱和手机立即绑定

如何在事件处理程序中进行安全的异步操作,防止不一致?

如何在事件处理程序中进行安全的异步操作,防止不一致?

慕桂英4014372 2021-09-30 14:01:44
(我不认为这是How do I make asynchronous call in an event handler的重复,即使标题相似。它也不同于关于禁用按钮的问题,因为可能有很多不同的事件会导致异步冲突。)当访问我的网页时,单击按钮或按下某个键时,我希望能够执行异步 Promise 链,例如读取数据库、读取文件或写入日志条目。但是这些需要离开事件处理程序/侦听器,因此似乎不可能在“then”链的末尾从原始处理程序返回值。这没问题,但是从处理程序同步(即立即)返回的问题是用户可能会单击同一个按钮或再次按下该键,甚至执行不相关的操作,这可能会触发冲突的异步操作(假设这些操作不能并行完成)。我想我想在异步操作正在进行时“关闭”事件系统(可能会在意外终止失败的情况下超时),但这感觉很危险。这肯定不是正确的做法。
查看完整描述

2 回答

?
繁星coding

TA贡献1797条经验 获得超4个赞

我发现处理这个问题的唯一方法是明显地(并且明确地)禁用交互。

一种方法是在所有内容前面放置一个整页半透明模态 div,以防止进一步的用户事件启动可能干扰任何正在进行的后台活动的新进程。

如果您的应用程序足够小以至于只有少数元素可能会触发新进程,那么显式禁用所有这些可能就足够了。


查看完整回答
反对 回复 2021-09-30
?
呼唤远方

TA贡献1856条经验 获得超11个赞

我做这样的事情(假设jquery)


$button.on('click', async function() {

    $(this).prop('disabled', true);

    try {

        // async handling here

        await asyncFunction();

    } catch(e) {


    } finally {

        $(this).prop('disabled', false);

    }

})

除了设置禁用之外,您还可以选择设置一个更多按钮观察者可以知道的变量,以便在您等待时更好地控制允许或不允许运行的内容。


或者设置一个阻止所有内容的整页加载模式。


或者甚至将指针事件设置为无,并通过 css 使光标成为加载光标。


查看完整回答
反对 回复 2021-09-30
  • 2 回答
  • 0 关注
  • 196 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信