JavaScript请求回调默认异步带来的问题及其解决方案

问题复现:今天遇到一个需求问题,在我们的某些数据表格中,删除数据之前都会检查该数据有没有对应关联的其他业务,如果有就不能删除它,提示用户当前数据存在关联业务,不能删除。而检查的接口也是通过js发送请求的方式进行的,这里就涉及到接收请求结果的问题了,大家先看如下代码:

 

首先不管你怎么发请求检查,返回的结果都是false,给你的都是不能删除的提示。

原因是默认不设置请求同步的话,回调函数的处理js是不等待的,也就是说直接走下面的代码,至于回调函数里面的代码是默认的异步执行。

该怎么解决呢?

这里提出一种解决方案:利用js里的async与await进行处理,只需要注意的是返回值的类型是对象类型,需要获取它的resolve属性值。 

这两个关键字是js同步机制里极其重要的封装函数,内部机制其实和倒计时器有些相似。

我个人认为还可以插个眼,监视这只眼的值变化,根据值的变化返回,但是代价是算法复杂度与辅助变量个数(主要运用到观察者模式,Object的代理对象监视对象属性变化)。

其实最简单的就是改成如下代码:

 这里不难发现只是进行了请求格式的变化,ajax请求可以将其的async属性变为false即为同步回调,等待回调函数处理结束再执行下面的代码。

拓展一下:之所以直接在代码里修改循环变量i的大小,其实就是让循环断开,你选中的批量数据中有一条无法删除则全部都不允许删除,这是业务逻辑要求,这里其实要说的是 js的foreach循环与for循环一样,不允许使用break跳出循环,但是可以采用try{}catch(e){}与return ;的方式跳出循环。像图中跳出循环的方式也是可以的,不推荐使用。

附加一点,在图中请求回调函数里返回数据,我们的上层函数返回接收不到,这是函数的迭代调用导致的,也可以说成闭包,比较当前函数的返回对上层函数来说是可见的,但并不等于上层函数返回。所以采用变量控制获取值,再退到上层函数的作用域中返回是安全的获取返回值的方式。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ForestSpringH

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值