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

9

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

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
这在异步流中是不可能的,我建议您将回调方法作为参数添加到 outer(cb) 中,在 ajax 请求完成时调用它。 - olsn
是的,你说得对,我想错了。 - Melkor
1个回答

8

你的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完成时调用该函数,将所需的值作为参数传递。这样你就可以得到真正的结果。

谢谢,但我实际上需要立即返回它。现在我意识到它就像 async: false 一样。所以我需要找其他方法。 - Melkor

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接