避免异步:false; 在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 。 有人可以概述一个更好的方法吗?

使用简单的回调机制

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

拥抱Web的异步特性。 当然,它是范式转换,但是当天的multithreading也是如此,在我看来,现在使用Deferred对象在jQuery中处理它的方式使其优于multithreading。 这就是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. }); 

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