避免异步:false; 在jQuery AJAX中的一个函数

ben*_*e89 0 javascript ajax jquery

这是我正在使用的一些伪代码(以及我通常使用的地方async: false;):

function getData(){
    var obj = {};
    if(!settings.data){
        $.ajax({
            url: '/someendpoint',
            async: false,
            success: function(data){
                obj = data;
            }
        });
    } else {
        obj = settings.data;
    }
    return obj;
}
Run Code Online (Sandbox Code Playgroud)

所以我们有一个返回一个对象的函数.现在,如果我们已经有了一些数据,我们只需分配这些数据,但如果不这样做,我们需要从服务器请求数据.是时候用了async: false?因为在返回obj之前我们需要暂停执行以获取数据?

我一次又一次地处理这个概念,async: false大多数时候都是这样.有人可以概述一个更好的方法吗?

Dav*_*nde 8

拥抱Web的异步特性.当然,它是范式转换,但是当天的多线程也是如此,在我看来,现在使用Deferred对象在jQuery中处理它的方式使其优于多线程.这就是Node.js变得如此受欢迎的原因.

不要像在网络上或其他答案中那样使用回调函数.了解Deferred和Promise对象,而不是返回数据,返回一个承诺,您可以使用该承诺将行为附加到该承诺"已解决"时.

function getData(){
    var obj;
    if(!settings.data){
        obj = $.get('/someendpoint');
    } else {
        obj = $.when(settings.data);
    }
    return obj;
}
Run Code Online (Sandbox Code Playgroud)

然后,调用者可以在可用时使用此数据,如下所示:

var promise = getData();
promise.done(function (data) {
    // Do something with the data.
});
Run Code Online (Sandbox Code Playgroud)

起初会感到尴尬,因为你不再返回数据,而是对数据的"承诺",但过了一段时间你就会'得到它'.相信我.

  • 我相信你Dave Van den Eynde. (2认同)

Aru*_*hny 6

使用简单的回调机制

function getData(callback){
    var obj = {};
    if(!settings.data){
        $.ajax({
            url: '/someendpoint',
            success: function(data){
                callback(data)
            }
        });
    } else {
        callback(settings.data)
    }
}

getData(function(data){
    //do things which depends on data
})
Run Code Online (Sandbox Code Playgroud)