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

时间:2013-09-23 11:08:46

标签: javascript jquery ajax

这是我正在使用的一些伪代码(以及我通常使用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;
}

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

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

2 个答案:

答案 0 :(得分:8)

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

不要只使用您在网络上或其他答案中阅读的回调函数。了解Deferred和Promise对象,而不是返回数据,返回一个承诺,您可以使用该承诺将行为附加到该承诺“已解决”时。

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

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

var promise = getData();
promise.done(function (data) {
    // Do something with the data.
});

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

答案 1 :(得分:5)

使用简单的回调机制

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
})