如何使函数返回它的内部函数的值?

时间:2011-12-19 08:51:23

标签: javascript jquery function return scope

这对你来说可能很明显,但我无法理解。

我需要创建返回其内部函数值的函数。换句话说,我有函数get_users()必须返回JSON对象。该JSON对象由$.post(内置jQuery)获取。

function get_users() {    
    return
        $.post(
            url_base + 'travel/trip/get_users/' + trip_id,
            function(response) {    
                return response;    
            },
            'json'
        );    
}

(以上是我试图做的,但它返回了undefined - 这真是一个惊喜)

由于范围可变,我不能只在内部函数中创建变量,因为它在main函数中不可见。我也不想使用全局变量。寻找更好的解决方案!

感谢任何建议!

3 个答案:

答案 0 :(得分:5)

为什么要与AJAX的异步性质作斗争?当您执行AJAX时,您应该习惯于使用事件和回调而不是编写顺序代码。你不能返回内在的内容。原因很简单,这个内部函数可以比外部函数执行得晚得多。因此,外部函数将在成功回调执行之前返回结果。

所以这是正确的方法:

function get_users() {
    $.post(
        url_base + 'travel/trip/get_users/' + trip_id, 
        function(response) {
            // instead of trying to return anything here
            // simply do something with the response
            // Depending on what the server sent you there
            // will be different ways.

            // Here you could also call some other custom function
            // and pass it the response
        }
        'json'
    );
}

答案 1 :(得分:3)

您无法从ajax调用返回值。 (没有设置async false,但那不是真正的ajax)

当您点击内部返回时,外部函数已经完成

您需要使用回调来处理用户。

get_users(function(response) { // this anonymous function is passed in as a parameter
    // do something with the response
});

function get_users(callback) {
    $.post(
        url_base + 'travel/trip/get_users/' + trip_id,
        function(response) {
            // call the passed in function and pass in the response as a parameter
            callback(response);     
        },
        json'
    );
}

答案 2 :(得分:2)

您需要了解异步ajax调用的工作原理。

当您致电$.post()时,它会启动网络通话以发布帖子并立即从$.post()来电返回并继续执行其余的javascript。它甚至会立即退出您的函数get_users()

但是,ajax调用尚未完成 - 它仍在进行中。一段时间之后,ajax调用将完成,当发生这种情况时,将调用已定义为function(response) {...}的ajax调用的成功处理程序。只有这样,在稍后的时间,才能知道ajax调用的响应值。

这就是异步ajax的含义。你不能写一个像get_users()这样的调用,并希望它能够获取用户并随之返回。相反,你必须使用将在稍后(当ajax完成时)调用的回调函数,然后你可以继续代码的路径。是的,这很不方便,但它是如何在javascript中使用异步ajax调用。异步ajax调用的好处是,当ajax调用正在进行时,浏览器和其他javascript代码可以完全生效。异步ajax调用的代价是对它们的编码更复杂。

您有多种选择来处理这种并发症。首先,您可以进行get_users()调用,然后继续执行您希望在get_users()内部回调中执行的编程序列,因为这是唯一知道响应(实际用户)的地方。如果您只在代码中的某个位置使用get_users(),则可以正常工作。它看起来像这样:

function get_users() {
    $.post(
        url_base + 'travel/trip/get_users/' + trip_id,
        function(response) {

            // process the user list here and continue whatever other code you
            // need that deals with the user list
        },
        'json'
    );
}

如果您需要在几个不同的地方使用get_users()用于不同的目的,那么您可以将其更改为自己进行回调并让post调用在ajax调用完成时调用该回调。然后,您将在该回调函数中完成对响应的处理:

function get_users(callback) {
    $.post(
        url_base + 'travel/trip/get_users/' + trip_id,
        callback,
        'json'
    );
}

在第二个选项中,您可以像这样调用get_users()

get_users(function(response) {
    // process the user list here and continue whatever other code you
    // need that deals with the user list
});

使用jQuery's deferred object可以获得更多高级选项。