Javascript 异步函数回调返回值

Javascript 异步函数回调返回值,javascript,jquery,Javascript,Jquery,我知道我可以传递回调函数来访问该值,但在我的例子中,它需要执行同步方法,这样我就可以在回调之外执行操作,有什么提示可以帮助我吗 var foo; function getFoo(callback) { $.ajax({ url: url, async: false }) .done(function(respond) { var data = respond.data; doStuff(da

我知道我可以传递回调函数来访问该值,但在我的例子中,它需要执行同步方法,这样我就可以在回调之外执行操作,有什么提示可以帮助我吗

var foo;

function getFoo(callback) {
    $.ajax({
        url: url,
        async: false
    })
            .done(function(respond) {
        var data = respond.data;
        doStuff(data, function(respond) { //This is callback from Asynchronous function
            callback(respond);
        })
    });
}

getFoo(function(respond) {
    foo = respond;
});

return foo; //How can I access foo value from respond

如果整个函数是同步的,则只能返回一个值;在您的例子中,doStuff是异步的,因此您不能像那样返回foo,但最好还是异步编写整个过程,因为如果使用jQuery的async:false选项,它会阻塞用户界面,直到返回AJAX结果

下面是一个如何重构代码的示例:

function example(exampleCallback) { 
    function getFoo(callback){
        $.ajax({
            url: url
        })
        .done(function(respond) {
            var data = respond.data;
            doStuff(data,function(respond){ //This is callback from Asynchronous function
              callback(respond);
            })
        });
    }

    getFoo(function(respond){
        exampleCallback(respond);
    });
}

example(function(foo) {
    //do something with foo
});
如果doStuff是异步的,那么它也不会工作,因为getFoo中的$.ajax是异步的:false您需要使用success:function{…}回调格式,而不是.done回调。。。从jQuery1.8开始,使用async:false和jqXHR$.Deferred是不推荐的;您必须使用success/error/complete回调选项,而不是jqXHR对象的相应方法,如jqXHR.done或不推荐使用的jqXHR.success