Javascript jQuery Ajax回调是如何工作的?

Javascript jQuery Ajax回调是如何工作的?,javascript,jquery,ajax,callback,return,Javascript,Jquery,Ajax,Callback,Return,各位程序员好!我刚刚开始了一个额外的编程项目,并向上帝发誓,我的代码将比以前更干净、更容易升级 然后我偶然发现了我的“劲敌”jQuery AJAX。上一次我想从AJAX调用返回一些东西时,我不得不竭尽全力使调用同步。这让事情变得黏黏的,丑陋的,我希望这次我能找到更好的 所以我在谷歌上搜索stackoverflow已经有一段时间了,只是不明白很多ppl都得到了一个叫做回调函数的解决方案。有人能给我举个例子,说明我如何利用这些回调函数返回登录状态: function doLogin(username

各位程序员好!我刚刚开始了一个额外的编程项目,并向上帝发誓,我的代码将比以前更干净、更容易升级

然后我偶然发现了我的“劲敌”jQuery AJAX。上一次我想从AJAX调用返回一些东西时,我不得不竭尽全力使调用同步。这让事情变得黏黏的,丑陋的,我希望这次我能找到更好的

所以我在谷歌上搜索stackoverflow已经有一段时间了,只是不明白很多ppl都得到了一个叫做回调函数的解决方案。有人能给我举个例子,说明我如何利用这些回调函数返回登录状态:

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