jQuery:将函数作为参数传递的问题

时间:2014-03-26 18:32:19

标签: jquery

我创建了一个通用函数,通过jQuery的AJAX调用从服务器获取数据。成功检索数据后,我想调用另一个我传入的函数(例如,在下面的代码示例中为functionAfterSuccess)。

这个传入的函数被调用,但它似乎正在执行而不是“等待”,直到从服务器成功检索数据。

传入函数(functionAfterSuccess)是否与主函数(genericAJAXGet)同时执行?不知道我做错了什么。

// calling function
$('#run').on('click' , function() {

    var $url = '/getdata';
    var $dataToSend = { id: '123', data: 'ABC' };

    genericAJAXGet("POST", $url, $dataToSend, "json", myFunction($param1));

});

// generic AJAX function
function genericAJAXGet($type, $url, $dataToSend, $returnDataType, functionAfterSuccess) {

    // build ajax request
    var $request = $.ajax({
                    type: $type,
                    url: $url,
                    data: $dataToSend,
                    dataType: $returnDataType
                });

    // Process a successful response
    $request.done(function(data) {

        if(data.error) {

            alert('uh oh');

        } else {

            // successfully returned data, but there was some application logic
            if (data["type"] == "issue") {

                alert('app logic issue');

            } else {

                // only run the passed in function when the data is successfully retrieved
                functionAfterSuccess;
            }
        }

    });

    // Process a failed response
    $request.fail(function() {
        alert('request failure');

    });
}

// Other function to be called that is being passed in as a parameter
function myFunction($param1) {

    alert($param1);

}

1 个答案:

答案 0 :(得分:3)

你可能(可能是因为你从未展示过如何调用main函数)没有传递函数,而是函数返回值:

<击> genericAJAXGet($type, $url, $dataToSend, $returnDataType, myFunction()) {

相反,它应该是:

genericAJAXGet($type, $url, $dataToSend, $returnDataType, myFunction) { // <--- no parentheses

然后,在您的代码中,将其称为:

        } else {

            // only run the passed in function when the data is successfully retrieved
            functionAfterSuccess(); // parentheses needed here to actually call it
        }

此外,您可能想检查functionAfterSuccess是否存在且是否为函数。


更新

如果您希望将参数发送到回调函数,您可以在主调用中添加另一个参数:

genericAJAXGet("POST", $url, $dataToSend, "json", myFunction, $param1);

然后将其定义更改为:

function genericAJAXGet($type, $url, $dataToSend, $returnDataType, functionAfterSuccess, functionParam) {
... 
}

最后,从函数内部调用它:

} else {

        // only run the passed in function when the data is successfully retrieved
        functionAfterSuccess(functionParam); // now the parameter is inside the parentheses
    }

为了更清楚,这是内部相关变化的功能:

function genericAJAXGet($type, $url, $dataToSend, $returnDataType, functionAfterSuccess, functionParam) {
    ... 
    } else {

        // only run the passed in function when the data is successfully retrieved
        functionAfterSuccess(functionParam); // now the parameter is inside the parentheses
    }
    ...
}

这就是你如何称呼它(用你的例子中的参数):

var $url = '/getdata';
var $dataToSend = { id: '123', data: 'ABC' };
myFunction = function(p) {
     alert(p);
}
var $param1 = 'Hey there!';
genericAJAXGet("POST", $url, $dataToSend, "json", myFunction, $param1);