AJAX ASYNC虚假与真实

时间:2013-05-15 15:44:51

标签: jquery ajax

我在这里有一个测试网站(kdmalikdesign.com/test/rsd/index.html)。我正在用它做一堆事情。我主要担心的是现在它不起作用,除非ASYNC是假的,我听说这是不好的做法?

现在我已经确定async为false的原因是因为当我触发成功回调时,xml数据没有被加载但是当我加载完成的回调时,一切都很好。我不得不将其更改为async false以使其与成功回调一起正常工作。

有没有具体的方法可以做到这一点?基本上ajax调用正在做的是抓取一个xml文件并通过它读取它,具体取决于使用特定数据填充页面的文件名。我基本上都是练习/练习。

谢谢你, Kamron

2 个答案:

答案 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内容的 工具,并实现了waterfallparallel运行模型。

故事的士气: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>