【问题标题】:Javascript callback functions with ajax带有ajax的Javascript回调函数
【发布时间】:2025-12-09 06:50:02
【问题描述】:

我正在编写一个通用函数,它将在我的脚本中的多个位置重复使用。

该函数使用 ajax(使用 jQuery 库),所以我想以某种方式将一个函数(或代码行)传递给该函数,以便在 ajax 完成时执行。 我相信这需要一个回调函数,但是在阅读了一些回调答案后,我仍然对如何在我的案例中实现感到有些困惑。

我目前的功能是:

function getNewENumber(parentENumber){

        $.ajax({
               type: "POST",
               url: "get_new_e_number.php",
               data: {project_number: projectNumber, parent_number: parentENumber},
               success: function(returnValue){
                    console.log(returnValue);
                    return returnValue; //with return value excecute code

                },
                error: function(request,error) {
                    alert('An error occurred attempting to get new e-number');
                    // console.log(request, error);
                }
        });
    }

有了这个函数,我希望能够以与其他 jQuery 函数相同的方式做一些事情,即;

var parentENumber = E1-3;

getNewENumber(parentENumber, function(){
    alert(//the number that is returned by getNewENumber);
});

【问题讨论】:

  • 我想,这是不可能的(或者至少,非常困难)。你应该交换功能。

标签: javascript jquery ajax callback


【解决方案1】:

使用 jQuery 的Deferred Objects 会更好。让您的 AJAX 调用 return jqXHR 对象。

function getNewENumber(parentENumber) {
    return $.ajax( { ... } );
}

getNewENumber(E1 - 3).then(success_callback, error_callback);

如果您想将错误回调 保留在该函数中,您可以在该函数中注册它:

function getNewENumber(parentENumber) {
    var jqXHR = $.ajax( { ... } );
    jqXHR.fail( ... );
    return jqXHR;
}

getNewENumber(E1 - 3).done(success_callback);

【讨论】:

    【解决方案2】:

    @patrick dw's anwser 是正确的。但是如果你想一直调用console.log(或任何其他操作),无论调用者代码函数做什么,你都可以在你已经拥有的成功函数中添加回调(你的新参数):

    function getNewENumber(parentENumber, cb_func /* <--new param is here*/){ 
    
        $.ajax({
               type: "POST",
               url: "get_new_e_number.php",
               data: {project_number: projectNumber, parent_number: parentENumber},
               success: function(returnValue){
                    console.log(returnValue);
                    cb_func(returnValue); // cb_func is called when returnValue is ready.
                },
                error: function(request,error) {
                    alert('An error occurred attempting to get new e-number');
                    // console.log(request, error);
                }
        });
    }
    

    调用代码和你的一样,只是函数将通过参数接收returnValue:

    var parentENumber = E1-3;
    
    getNewENumber(parentENumber, function(val /* <--new param is here*/){
        alert(val);
    });
    

    【讨论】:

    • 是的,当我在我的代码中实现它时,我确实想知道如果我想要其他成功操作该怎么做。谢谢
    【解决方案3】:

    只需为函数提供另一个参数getNewENumber,然后将其用作回调。

       // receive a function -----------------v
    function getNewENumber( parentENumber, cb_func ){
    
        $.ajax({
               type: "POST",
               url: "get_new_e_number.php",
               data: {project_number: projectNumber, parent_number: parentENumber},
    
                 // ------v-------use it as the callback function
               success: cb_func,
                error: function(request,error) {
                    alert('An error occurred attempting to get new e-number');
                    // console.log(request, error);
                }
        });
    }
    
    var parentENumber = E1-3;
    
    getNewENumber(parentENumber, function( returnValue ){
        alert( returnValue );
    });
    

    【讨论】:

    • 完美。我新它会很简单。当它放在你自己的上下文中时总是更容易学习。谢谢