1、前言:
一直做后端开发,因为这段时间前端手里都有活,想着自己好歹也学过js,bootstrap也改过,就自己上吧,都是语言,不就跟写java差不多嘛!!!结果就遇到了感觉莫名其妙的问题,让我对js的执行顺序感到深深的好奇
2、遇到的问题:
简单描述下我写的方法比较好理解一些,如方法及结果下图。其中 getListByCompCodeAndFitName是调用后端做的一个查询,最终想要输出的结果是多个错误拼接结果。
在各个方法前中后都加了日志打印,在父方法之后又输出一个结果打印。结果日志打印如下:
有些理解不了这个执行顺序,所以找了下信息:
简单来说就是js中的事件分同步和异步两种,先执行同步再执行异步, getListByCompCodeAndFitName是调用后端的方法,属于异步。因此是在所有同步时间执行结束之后它才执行的。
3、解决办法
知道原因了,就开始探究解决办法,我肯定是想让同步事件在getListByCompCodeAndFitName执行之前等等它,让异步事件执行完之后把结果带出来的。
所以还得找找办法,第一想到的就是加时间等待一会,可能会出现的问题是后端访问超时,这个要等待的时间就不能确定是多长了。值确定起来有点麻烦效果可能还不怎么好。
在找的过程中了解到了async、promise对象,虽然不知道怎么用的,但是大概率就是用这两种方式来解决这个问题。
后来在试的过程中问了下同事,改正了一下:主要是把async: false参数改成了false,不允许异步。
然后就得到了我想要的打印顺序!
function getListByCompCodeAndFitName(obj,dataJson,result,j){ $.ajax({ type: "POST", contentType: 'application/json;charset=UTF-8', dataType: "json", async: false, url: baseURL + '/base/finProfitCenter', data: JSON.stringify(dataJson), success: function (data1) { if (data1.length == 0) { result.push("第"+(j+1)+"行利润中心错误") console.log("打印查询checkAndNotifyLineData中1getListByCompCodeAndFitName中:"+ result) } else { console.log("打印1"+ JSON.stringify(data1)) obj.attribute1 = data1.attribute1; obj.profitCenterCode = data1.profitCenterCode; } }, error: function () { result.push("利润中心查询失败") } }); }