0

这是我正在使用的一些伪代码(以及我通常在哪里使用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大多数时间。有人可以概述一个更好的方法吗?

4

2 回答 2

8

拥抱网络的异步特性。诚然,这是范式转变,但多线程在过去也是如此,在我看来,现在在 jQuery 中使用 Deferred 对象处理它的方式使其优于多线程。这就是 Node.js 变得如此流行的原因。

不要只使用您可能在网络上或其他答案中阅读的回调函数。了解 Deferred 和 Promise 对象,而不是返回数据,而是返回一个 Promise,您可以使用该 Promise 将行为附加到该 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.
});

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

于 2013-09-23T11:20:05.130 回答
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
})
于 2013-09-23T11:13:31.510 回答