今天在写一个函数时,因为要和后台交互数据,就使用了jQuery的ajax,这里我使用的是mini UI的ajax,其实都一样。
原函数如下:
function queryAgain(){
SLData.again = 'again';
var json=nui.encode({params:SLData});
var againData;
nui.ajax({
url: "com.vbm.fmis.gl.voucher.voucher.queryVoucherMain.biz.ext",
type: 'POST',
data:json,
success: function (data) {
againData = data.vos;
},
error: function (jqXHR, textStatus, errorThrown) {
nui.alert(jqXHR.responseText);
}
});
return againData;
}
这里仅仅就是查询获得自己需要的数据,然后要在另外一个function里用到这些数据,但是,最终的得到的数据 againData 总是undefined,确定后台已经查询出数据,一开始以为是逻辑流配置错误,再三检查,发现没有错误,始终搞不明白到底哪里出现问题,最终,在同事的帮助下,找到了原因。
原因:我们在利用ajax与后台交互时,有一个属性是async,它的值要么为true,要么为false,如果我们不写async,默认情况下,是true。async的意义在于请求是否异步或者同步,当async为true时,浏览器会执行两个线程,一个是ajax部分,另一个是
ajax后面的部分。而async为false的情况下,浏览器只有执行了ajax中的success部分,才会继续向下执行后面的操作。
导致:可以看到,我这里声明里一个变量 againData,我的本意是将后台数据赋值给 againData,然后进行返回,从而在另外一个函数那里调用这些数据。但是由于 我没有将async声明为false,浏览器会直接返回 againData,导致我return的数据总是undefined。
改为false此问题即可解决:
以后使用ajax时一定要提前想清楚自己的想法,抓住细节才可以成功!
2019-3-4更新,一个同样的错误犯的第二遍,看这里