PageMethods减慢了进程并降低了工作量

时间:2014-04-09 04:37:00

标签: javascript pagemethods

我的页面上有很多页面方法。每个方法用于从数据库中获取数据。我按照以下方式订购了它们。但我的问题是成功方法之外的行,但主要功能内部正在页面方法完成过程之前工作

function check_valid()
{
     // some code
     Pagemethod1
     function suc1()
     {
       //some code
       PageMethod2
       function suc2()
       {
         //some code
         Page Method3
         function suc3()
         {
           //some code
         }
         function err3(){}
       }
       function err2(){}
     }
     function err1(){}
 return true;               //this line is working before the pagemethods complete the process
 }

4 个答案:

答案 0 :(得分:2)

我不熟悉“PageMethods”,但听起来这些函数中的每一个都是异步的,因为它从远程数据库接收数据。因为JavaScript在一个单独的线程内运行,所以异步进程通常可以选择附加一个在进程完成后触发的回调函数。这允许javascript在等待您的慢速数据库调用时执行其他操作,例如return true,解释您的观察结果。

相反,请在数据库API中使用回调模式:

editDatabase(args*, function() {
    //Stuff to do database call is complete
});

或者,您的数据库API可能使用事件模式:

var myDb = new DB();
myDb.edit(args*)
myDb.bind('complete', function() {
    //Stuff to do database call is complete
});

或者,您的数据库API可能使用promises,您可以阅读here

如果您从同步语言转移,这些模式可能需要一些习惯,但它们对JavaScript至关重要。您还可以找到JavaScript here的异步方面的良好指南。

答案 1 :(得分:1)

按如下方式更改您的代码

function check_valid()
{
     // some code
     Pagemethod1
     function suc1()
     {
       //some code
       PageMethod2
       function suc2()
       {
         //some code
         Page Method3
         function suc3()
         {
           //some code
           return true;
         }
         function err3(){}
        }
       function err2(){}
     }
     function err1(){}
   }

因为PageMethods将一个接一个地工作。

答案 2 :(得分:0)

使用javascript类可能有所帮助。回调也是ajax的关键。

function check_valid(){ 
 var fn = this; //assign this to a variable for ease of use
 var callbacks = []; //array to store all results
 var calls = []; //all ajax calls
 this.complete = function(callback){
  function check(){
   if(callbacks.length==calls.length){
    callback(callbacks);
   }else{
    setTimeout(function(){
     fn.check()
    },50);
   }
  }
  return fn;
 }
 this.callServ(params){
  calls.push(params);
  params.success = function(ret){
   callbacks.push({data:ret,status:'success'});
  }
  params.error = function(ret){
   callbacks.push({data:ret,status:'success'});
  }
  $.ajax(params);
  return fn;
 }
 return this;
}

这应该允许您系统地执行多个调用,然后使用单个回调来处理它们。我使用jquery ajax使ajax调用更容易,并传递相同的参数。

所以它看起来像这样使用:

var checkValid = new check_valid();

checkValid.callServ({url:url,data:data});
checkValid.callServ({url:url,data:data});
checkValid.callServ({url:url,data:data});

checkValid.complete(function(data){
 //data is an array of all call serv returns.
});

这可能与您目前的情况相差甚远,信息量并没有告诉我究竟做了什么。这个例子可能有点高级,但它可以给人一种同步的错觉,至少和javascript一样接近。

答案 3 :(得分:0)

我找到了自己的解决方案。经过长时间的研究,我已经找到了解决方案。页面方法只会因为它们的安排而变慢。我们必须决定在哪里调用它,然后我们必须打电话。由于我重新排序它们,它给了一些错误。现在它的工作正常。