传递包含参数的回调函数?(复制)

时间:2022-12-08 20:21:04

This question already has an answer here:

这个问题已经有了答案:

I have this below code..

我有下面的代码。

function getGrades(grading_company) {

    if (grading_company == 'Not Specified') {

        // Remove grades box & show condition box
        showConditionBox();

    } else {

        // Set file to get results from..
        var loadUrl = "ajax_files/get_grades.php";

        // Set data string
        var dataString = 'gc_id=' + grading_company;

        // Set the callback function to run on success
        var callback = showGradesBox;

        // Run the AJAX request
        runAjax(loadUrl, dataString, callback);  

    }

}

function runAjax(loadUrl, dataString, callback) {

    jQuery.ajax({
        type: 'GET',
        url: loadUrl,
        data: dataString,
        dataType: 'html',
        error: ajaxError,
        success: function(response) {
            callback(response);
        }
    });    

}

Edit: Here is the function that gets called as the callback function:

这个函数被称为回调函数:

function showGradesBox(response) {

    // Load data into grade field
    jQuery('#grade').html(response);

    // Hide condition fields
    jQuery('#condition').hide();
    jQuery('#condition_text').hide();

    // Show grade fields
    jQuery('#grade_wrapper').show();
    jQuery('#grade_text_wrapper').show();    

}

Now if I wanted to pass the grading_company variable to the callback function as a parameter is there a way to do that without having to add it as another parameter in the runAjax call? I'm trying to keep the runAjax function open to other usage so I don't want to pass in any extra parameters; but if it can somehow be included within the callback then great.

现在,如果我想将grading_company变量作为参数传递给回调函数,有没有一种方法可以做到这一点而不需要在runAjax调用中添加它作为另一个参数?我试图保持runAjax函数对其他用途开放,所以我不想传递任何额外的参数;但是如果它可以包含在回调中,那就太棒了。

2 个解决方案

#1


43  

change your callback to an anonymous function:

将回调更改为匿名函数:

// Set the callback function to run on success
var callback = function () {
    showGradesBox(grading_company);
};

This allows you to pass parameters to the inner function.

这允许您将参数传递给内部函数。

Edit: to allow for the ajax response:

编辑:允许ajax响应:

// Set the callback function to run on success
var callback = function (response) {
    showGradesBox(grading_company, response);
};

#2


2  

Another possibility is instead of doing dataString do dataObject then pass that object to the callback. Like so:

另一种可能是不执行dataString do dataObject,而是将该对象传递给回调。像这样:

function getGrades(grading_company) {

    if (grading_company == 'Not Specified') {

        // Remove grades box & show condition box
        showConditionBox();

    } else {

        // Set file to get results from..
        var loadUrl = "ajax_files/get_grades.php";

        // Set data object
        var dataObject = {
            'gc_id' : grading_company
            /*to do multiples..
            'item1' : value1, 
            'item2' : value2, 
            'etc' : etc */
        }

        // Set the callback function to run on success
        var callback = showGradesBox;

        // Run the AJAX request
        runAjax(loadUrl, dataObject, callback);  

    }

}

function runAjax(loadUrl, dataObject, callback) {

    jQuery.ajax({
        type: 'GET',
        url: loadUrl,
        data: $.param(dataObject),
        dataType: 'html',
        error: ajaxError,
        success: function(response) {
            callback(response, dataObject);
        }
    });    

}

Note the addition of $.param().

注意添加了$.param()。

Then in the callback function, you should know what data you're after. If function setGrades(resp, data) { ... } was the callback, then you can access the values in setGrades

然后在回调函数中,你应该知道你想要的是什么数据。如果函数设置为(resp, data){…}是回调,然后您可以访问setGrades中的值

function setGrades(resp, data) {
   alert( data.gc_id);
}

EDIT

编辑

After testing, I realize that $(dataObject).serialize() will not work. So I've updated to use $.param(). Please see this SO post for more info.

在测试之后,我意识到$(dataObject).serialize()不能工作。因此我更新了使用$.param()。更多信息请点击这里。

#1


43  

change your callback to an anonymous function:

将回调更改为匿名函数:

// Set the callback function to run on success
var callback = function () {
    showGradesBox(grading_company);
};

This allows you to pass parameters to the inner function.

这允许您将参数传递给内部函数。

Edit: to allow for the ajax response:

编辑:允许ajax响应:

// Set the callback function to run on success
var callback = function (response) {
    showGradesBox(grading_company, response);
};

#2


2  

Another possibility is instead of doing dataString do dataObject then pass that object to the callback. Like so:

另一种可能是不执行dataString do dataObject,而是将该对象传递给回调。像这样:

function getGrades(grading_company) {

    if (grading_company == 'Not Specified') {

        // Remove grades box & show condition box
        showConditionBox();

    } else {

        // Set file to get results from..
        var loadUrl = "ajax_files/get_grades.php";

        // Set data object
        var dataObject = {
            'gc_id' : grading_company
            /*to do multiples..
            'item1' : value1, 
            'item2' : value2, 
            'etc' : etc */
        }

        // Set the callback function to run on success
        var callback = showGradesBox;

        // Run the AJAX request
        runAjax(loadUrl, dataObject, callback);  

    }

}

function runAjax(loadUrl, dataObject, callback) {

    jQuery.ajax({
        type: 'GET',
        url: loadUrl,
        data: $.param(dataObject),
        dataType: 'html',
        error: ajaxError,
        success: function(response) {
            callback(response, dataObject);
        }
    });    

}

Note the addition of $.param().

注意添加了$.param()。

Then in the callback function, you should know what data you're after. If function setGrades(resp, data) { ... } was the callback, then you can access the values in setGrades

然后在回调函数中,你应该知道你想要的是什么数据。如果函数设置为(resp, data){…}是回调,然后您可以访问setGrades中的值

function setGrades(resp, data) {
   alert( data.gc_id);
}

EDIT

编辑

After testing, I realize that $(dataObject).serialize() will not work. So I've updated to use $.param(). Please see this SO post for more info.

在测试之后,我意识到$(dataObject).serialize()不能工作。因此我更新了使用$.param()。更多信息请点击这里。