这是我正在使用的一些伪代码(以及我通常使用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
。有人可以概述一个更好的方法吗?
答案 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
})