在页面中的js部分作如下声明:
var buffalo = new Buffalo('');
buffalo.async = false;//同步调用
在某js方法中先通过buffalo取得学生列表,然后在循环中根据学生id取得学生的相关信息。按如下方法正常运行,结果为 1 2 1 2依次显示。但如果将“注释掉”的行注释掉,且将buffalo1改为buffalo后,运行结果为1 1 2 2 ......
function onPrint(){
... ...
var buffalo1 = new Buffalo('');//注释掉
buffalo1.async = false;//注释掉
buffalo1.remoteActionCall("remoteEvaluateReport.action","remoteGetStudents",[classId],function(reply){
var stuList=reply.getResult();
for(var j=0;j<stuList.length;j++){
alert(1);
getStuInfo(stuList[j].id);
}
});
}
function getStuInfo(stuId){ buffalo.remoteActionCall("remoteEvaluateReport.action","remoteGetStuPersonInfo",[stuId],function(reply){
if(reply!=null){
alert(2);
... ...
}
});
}
这样的结果是,本应按照js的先后顺序来执行,但当出现了嵌套时,外层先执行完,再依次执行内层。究其原因,buffalo在同步执行时。第一次(即外层)还未调用完时第二次调用(即内层)是不会被执行的,
remoteActionCall: function(action, method, params, callback) {
... ...
if (!this.requesting) {
this.nextRemoteCall();
}
}
而是等到第一次(即外层)的调用完成后,再进行第二次(即内层)的调用
_remoteCall: function(url, burlapCall, callback) {
... ...
if (this.async) {
this.transport.onreadystatechange = this.onStateChange.bind(this);
this.events["onLoading"](true);
} else {
this.response();
}
},
response : function() {
... ...
this.nextRemoteCall();
... ...
}