Javascript jQuery Ajax回调是如何工作的?
各位程序员好!我刚刚开始了一个额外的编程项目,并向上帝发誓,我的代码将比以前更干净、更容易升级 然后我偶然发现了我的“劲敌”jQuery AJAX。上一次我想从AJAX调用返回一些东西时,我不得不竭尽全力使调用同步。这让事情变得黏黏的,丑陋的,我希望这次我能找到更好的 所以我在谷歌上搜索stackoverflow已经有一段时间了,只是不明白很多ppl都得到了一个叫做回调函数的解决方案。有人能给我举个例子,说明我如何利用这些回调函数返回登录状态:Javascript jQuery Ajax回调是如何工作的?,javascript,jquery,ajax,callback,return,Javascript,Jquery,Ajax,Callback,Return,各位程序员好!我刚刚开始了一个额外的编程项目,并向上帝发誓,我的代码将比以前更干净、更容易升级 然后我偶然发现了我的“劲敌”jQuery AJAX。上一次我想从AJAX调用返回一些东西时,我不得不竭尽全力使调用同步。这让事情变得黏黏的,丑陋的,我希望这次我能找到更好的 所以我在谷歌上搜索stackoverflow已经有一段时间了,只是不明白很多ppl都得到了一个叫做回调函数的解决方案。有人能给我举个例子,说明我如何利用这些回调函数返回登录状态: function doLogin(username
function doLogin(username, password) {
$.ajax({
url: 'jose.php?do=login&user='+username+'&pass='+password,
dataType: 'json',
success: function(data) {
if(data.success==1) {
return('1');
} else {
return('2');
}
$('#spinner').hide();
},
statusCode: {
403:function() {
LogStatus('Slavefile error: Forbidden. Aborting.');
$('#spinner').hide();
return (3);
},
404:function() {
LogStatus('Slavefile was not found. Aborting.');
$('#spinner').hide();
return (3);
},
500:function() {
LogStatus('Slavefile error: Internal server error. Aborting.');
$('#spinner').hide();
return (3);
},
501:function() {
LogStatus('Slavefile error: Not implemented. Aborting.');
$('#spinner').hide();
return (3);
}
},
async: true
});
}
因此,您可能知道,您不能像我在AJAX调用中那样使用return
。您应该使用回调函数,我不知道如何使用
如果有人能用回调函数给我写这段代码,并向我解释它们是如何工作的,我将非常感激
编辑:
我真的需要退货,而不是马上用。此函数是从另一个函数中调用的,应该能够从不同的位置调用,而无需稍微重写
/编辑
诚恳地
阿克克
Oy Aimo Latvala Ab的Web开发人员回调只是在满足某些条件时运行的函数。在这种情况下,ajax取得了“成功” 您已经在使用回调,但无法识别它<代码>成功:函数(数据){}是一个回调函数,但它就是所谓的匿名函数。它没有名称或引用,但仍在运行。如果要将此匿名函数更改为命名函数,非常简单:将匿名函数中的代码放入命名函数中,然后只调用命名函数:
[...]success: function(data) {
if(data.success==1) {
return('1');
} else {
return('2');
}
$('#spinner').hide();
}, [...]
应改为:
[...]success: function(){ callbackThingy(data) }, [...]
现在只需创建callbackThingy
函数:
function callbackThingy(data){
if(data.success==1) {
someOtherFunction('1');
} else {
someOtherFunction('2');
}
$('#spinner').hide();
}
请注意,“return”值不起任何作用。它只是停止回调函数,无论您是在匿名函数中还是在命名函数中。因此,您还必须编写第二个函数,名为someOtherFunction
:
function someOtherFunction(inValue){
if(inValue=='1') {
// do something.
} else if(inValue=='2') {
// do something else.
}
}
如果必须传递参数,则可以使用上面的示例。如果不需要传递参数,则设置更简单:
[...]success: callbackThingy, [...]
function callbackThingy(){
// do something here.
}
回调函数只是在满足某些条件时运行的函数。在这种情况下,ajax取得了“成功” 您已经在使用回调,但无法识别它<代码>成功:函数(数据){}是一个回调函数,但它就是所谓的匿名函数。它没有名称或引用,但仍在运行。如果要将此匿名函数更改为命名函数,非常简单:将匿名函数中的代码放入命名函数中,然后只调用命名函数:
[...]success: function(data) {
if(data.success==1) {
return('1');
} else {
return('2');
}
$('#spinner').hide();
}, [...]
应改为:
[...]success: function(){ callbackThingy(data) }, [...]
现在只需创建callbackThingy
函数:
function callbackThingy(data){
if(data.success==1) {
someOtherFunction('1');
} else {
someOtherFunction('2');
}
$('#spinner').hide();
}
请注意,“return”值不起任何作用。它只是停止回调函数,无论您是在匿名函数中还是在命名函数中。因此,您还必须编写第二个函数,名为someOtherFunction
:
function someOtherFunction(inValue){
if(inValue=='1') {
// do something.
} else if(inValue=='2') {
// do something else.
}
}
如果必须传递参数,则可以使用上面的示例。如果不需要传递参数,则设置更简单:
[...]success: callbackThingy, [...]
function callbackThingy(){
// do something here.
}
基本的“我需要一个异步回调”模式包括三个部分:
function doLogin(username, password) {
// ...
return something;
}
switch(doLogin(u, p)) {
case '1':
//...
break;
case '2':
//...
break;
//...
}
但是,doLogin
必须对远程服务器进行异步调用。你只需要像这样重新安排一些事情:
function doLogin(username, password, callback) {
return $.ajax({
// ...
success: function(data) {
if(data.success == 1)
callback('1');
else
callback('2');
},
//...
});
}
var jqxhr = doLogin(u, p, function(statusCode) {
switch(statusCode)) {
case '1':
//...
break;
case '2':
//...
break;
//...
}
});
允许您在AJAX连接返回之前引用它,如果需要取消调用、附加额外的处理程序等,您可以使用它。基本的“我需要异步回调”模式有三个部分:
function doLogin(username, password) {
// ...
return something;
}
switch(doLogin(u, p)) {
case '1':
//...
break;
case '2':
//...
break;
//...
}
但是,doLogin
必须对远程服务器进行异步调用。你只需要像这样重新安排一些事情:
function doLogin(username, password, callback) {
return $.ajax({
// ...
success: function(data) {
if(data.success == 1)
callback('1');
else
callback('2');
},
//...
});
}
var jqxhr = doLogin(u, p, function(statusCode) {
switch(statusCode)) {
case '1':
//...
break;
case '2':
//...
break;
//...
}
});
允许您在AJAX连接返回之前引用它,如果需要取消调用、附加额外的处理程序等,您可以使用它。从原始帖子中的编辑中,我可以看出您只需要存储一个(更多)全局变量。试试这个:
// in the global scope , create this variable:
// (or -- at least -- in the scope available to both this ajax call
// and where you are going to use it)
var valHolder = -1;
// then edit your ajax call like this:
[...]
success: function(data) {
if(data.success==1) {
valHolder = 1;
} else {
valHolder = 2;
}
$('#spinner').hide();
},
[...]
现在,您可以验证3件事:
valHolder=-1
表示ajax调用尚未成功返回
valHolder=1
表示data.success=1
valHolder=2
表示data.success!=1
另一个选项是将变量存储在某个元素的HTML属性中
最后,您可能应该查看,了解管理存储数据的最新jquery方法
这有帮助吗?从您原始帖子中的编辑中,我可以看出您只需要存储一个(更多)全局变量。试试这个:
// in the global scope , create this variable:
// (or -- at least -- in the scope available to both this ajax call
// and where you are going to use it)
var valHolder = -1;
// then edit your ajax call like this:
[...]
success: function(data) {
if(data.success==1) {
valHolder = 1;
} else {
valHolder = 2;
}
$('#spinner').hide();
},
[...]
现在,您可以验证3件事:
valHolder=-1
表示ajax调用尚未成功返回
valHolder=1
表示data.success=1
valHolder=2
表示data.success!=1
另一个选项是将变量存储在某个元素的HTML属性中
最后,您可能应该查看了解最新的j