JavaScript:如何在异步内部函数内返回外部函数?

时间:2014-04-13 11:54:16

标签: javascript jquery ajax asynchronous closures

我知道我可以使用外部变量来识别外部函数需要处理的某些状态。但请考虑一下:如果内部函数是异步的?外部函数不会等待内部函数的变量会改变,那么我现在该如何返回外部函数呢?

function outer() {
    var flag = true;
    // For example, a jquery-like ajax call
    $.ajax({
        // Some settings
        error: function(jqXHR, textStatus, errorThrown) {
            // Here I want to return outer()
            flag = false;
        }
    });
    return flag;
}

正如您所看到的,如果我使用flag作为返回值,outer()很可能会返回true,因为ajax调用可能需要很长时间。出于同样的原因,我不想设置async: false因为这会阻止页面反应。

1 个答案:

答案 0 :(得分:7)

您的outer函数会立即返回,因此您始终会将true作为flag的值。为了获得正确的值,您需要让异步函数完成其工作并在准备就绪时回复您。考虑一下:

function outer(cb) {
    var flag = true;
    // For example, a jquery-like ajax call
    $.ajax({
        // Some settings
        error: function (jqXHR, textStatus, errorThrown) {
            // Here I want to return outer()
            flag = false;
            cb(flag);
        },
        success: function () {
            flag = true; // or whatever value you need.
            cb(flag);
        }
    });
}

function callback(flag) {
    // this function will be called after the ajax is complete.
    // real value of flag variable will be available here
    console.log(flag);
}
outer(callback);

将函数作为参数传递给外部函数,并在ajax完成时使用您需要的值作为参数调用该函数。通过这种方式,您将获得真实的结果。