5

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

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

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

谢谢你,卡姆伦

4

3 回答 3

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% 的时间被回调替换。

于 2013-05-15T15:50:22.380 回答
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对象是有帮助的,这样多个其他函数可以在需要时使用相同的请求。

于 2013-05-15T16:20:59.480 回答
0

async true 同一个请求位置使得数据溢出很关键,特别是在数据库查询中,如果请求是重复的,会产生太多的连接问题。

第二到第 n 个请求将响应更长的时间

于 2017-08-12T01:53:18.560 回答