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

Posted

技术标签:

【中文标题】JavaScript:如何在异步内部函数中返回外部函数?【英文标题】:JavaScript: How to return an outer function inside an asynchronous inner function? 【发布时间】:2014-05-27 08:53:00 【问题描述】:

我知道我可以使用外部变量来识别外部函数需要处理的某些状态。但是考虑一下:如果内部函数是异步的?外层函数不会等到内层函数的变量发生变化,那现在怎么才能返回外层函数呢?

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,因为这会阻止页面反应。

【问题讨论】:

异步流无法做到这一点,我建议您在 ajax 请求完成时调用 outer(cb) 的参数作为参数。 是的,你是对的,我想错了。 【参考方案1】:

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

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 一样。所以我会找到其他方法。

以上是关于JavaScript:如何在异步内部函数中返回外部函数?的主要内容,如果未能解决你的问题,请参考以下文章

如何从Objective-C中的异步内部函数内部返回外部函数

javascript 闭包及其解决

Javascript异步函数控制台记录返回的数据

当for内部有查询时如何返回异步函数的值

javascript 闭包

SyntaxError:“等待”外部函数,即使它在异步内部