buffalo 嵌套调用

在页面中的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();

... ...

 }

 

 

你可能感兴趣的:(function,null,url,action,callback)