我的页面上有很多页面方法。每个方法用于从数据库中获取数据。我按照以下方式订购了它们。但我的问题是成功方法之外的行,但主要功能内部正在页面方法完成过程之前工作
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
}
答案 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)
我找到了自己的解决方案。经过长时间的研究,我已经找到了解决方案。页面方法只会因为它们的安排而变慢。我们必须决定在哪里调用它,然后我们必须打电话。由于我重新排序它们,它给了一些错误。现在它的工作正常。