问题复现:今天遇到一个需求问题,在我们的某些数据表格中,删除数据之前都会检查该数据有没有对应关联的其他业务,如果有就不能删除它,提示用户当前数据存在关联业务,不能删除。而检查的接口也是通过js发送请求的方式进行的,这里就涉及到接收请求结果的问题了,大家先看如下代码:
首先不管你怎么发请求检查,返回的结果都是false,给你的都是不能删除的提示。
原因是默认不设置请求同步的话,回调函数的处理js是不等待的,也就是说直接走下面的代码,至于回调函数里面的代码是默认的异步执行。
该怎么解决呢?
这里提出一种解决方案:利用js里的async与await进行处理,只需要注意的是返回值的类型是对象类型,需要获取它的resolve属性值。
这两个关键字是js同步机制里极其重要的封装函数,内部机制其实和倒计时器有些相似。
我个人认为还可以插个眼,监视这只眼的值变化,根据值的变化返回,但是代价是算法复杂度与辅助变量个数(主要运用到观察者模式,Object的代理对象监视对象属性变化)。
其实最简单的就是改成如下代码:
这里不难发现只是进行了请求格式的变化,ajax请求可以将其的async属性变为false即为同步回调,等待回调函数处理结束再执行下面的代码。
拓展一下:之所以直接在代码里修改循环变量i的大小,其实就是让循环断开,你选中的批量数据中有一条无法删除则全部都不允许删除,这是业务逻辑要求,这里其实要说的是 js的foreach循环与for循环一样,不允许使用break跳出循环,但是可以采用try{}catch(e){}与return ;的方式跳出循环。像图中跳出循环的方式也是可以的,不推荐使用。
附加一点,在图中请求回调函数里返回数据,我们的上层函数返回接收不到,这是函数的迭代调用导致的,也可以说成闭包,比较当前函数的返回对上层函数来说是可见的,但并不等于上层函数返回。所以采用变量控制获取值,再退到上层函数的作用域中返回是安全的获取返回值的方式。