我在这里有一个测试网站(kdmalikdesign.com/test/rsd/index.html)。我正在用它做一堆事情。我主要担心的是现在它不起作用,除非ASYNC是假的,我听说这是不好的做法?
现在我已经确定async为false的原因是因为当我触发成功回调时,xml数据没有被加载但是当我加载完成的回调时,一切都很好。我不得不将其更改为async false以使其与成功回调一起正常工作。
有没有具体的方法可以做到这一点?基本上ajax调用正在做的是抓取一个xml文件并通过它读取它,具体取决于使用特定数据填充页面的文件名。我基本上都是练习/练习。
谢谢你, Kamron
答案 0 :(得分:5)
运行同步调用通常是一种弊端,因为当您使用回调以异步方式执行相同操作时,您正在有效地运行请求,同时失去异步性的所有好处。
async:false
会导致jQuery.ajax()
调用阻塞,直到它返回为止。实际上,在伪代码中,而不是:
function ajax:
perform request
callback with results
你这样做:
function ajax:
perform request
while (no results) wait
return results
这完全阻止了其他任何事情的执行,直到结束......这非常可怕。显而易见的用例是以waterfall
模式运行内容:task 1 -> task 2 -> task 3
,这可能会发生。
如果您能够阻止浏览器,仍然可以考虑使用回调。它们将允许您在处理内容时保持站点的其余部分活动。您可以通过设置async:true
并在下一步提供回调来轻松完成此操作。但是,您最终可能会使用回调意大利面,如果您拥有它们,可能需要使用库来管理大型操作。
非常好的候选人来自Node.JS,名为async.js
。它是MapReduce内容的 工具,并实现了waterfall
和parallel
运行模型。
故事的士气:async:false可以100%的时间被回调替换。
答案 1 :(得分:1)
如果您想实现异步调用,那么您希望将所有使用结果数据完成的逻辑组织到.succcess()回调中。
async为false的原因是因为当我触发成功回调时,xml数据没有加载,但是当我加载完成的回调时,一切都正常加载。
您问题中的那一行有点令人困惑,因为根据定义,一旦请求完成并且返回的任何数据都可用,就会执行success callback
。
这是async: true
无法做到的一个例子:
function ajaxrequest() {
var someValue;
$.get('serverFile.php', function(data){
someValue = data;
});
return someValue;
}
在这种情况下,变量someValue
在返回时将为空,因为您提供的回调未与其他代码一起同步或内联执行
要使用async:true
,您可以按照以下方式整理代码:
function getData() {
return $.get('serverFile.php');
}
function alertData() {
getData().done(function(data){
alert(data);
});
}
function logData() {
getData().done(function(data){
console.log(data);
});
}
我已经通过这种方式进行了分解,因此您可以看到隔离请求方法并让它们返回jQuery Deferred对象以便多个其他函数可以根据需要使用相同的请求。 p>