【问题标题】:AJAX ASYNC False vs. TrueAJAX ASYNC 假与真
【发布时间】:2017-08-12 09:53:18
【问题描述】:

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

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

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

谢谢你, 卡姆龙

【问题讨论】:

  • This question 可能会有所帮助。您现在的问题没有详细信息或代码,因此无法回答。
  • ASYNC FALSE 只被认为是坏的,因为它会让浏览器等到 AJAX 完成后再继续下一步。如果这对您的应用程序有意义,那么应该没问题。
  • 听起来你正在做的事情可以用async: true 来完成,你很可能没有正确处理逻辑。例如,成功回调不应返回数据,也不应更新任何未在成功回调中直接定义的变量。

标签: jquery ajax


【解决方案1】:

运行同步调用通常是一种弊端,因为当您可以使用回调以异步方式执行相同的操作时,您会有效地运行请求而失去异步性的所有好处。

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% 的情况下被回调替换。

【讨论】:

  • 有时是必要的。请使用beforeClose 回调查看我的问题;这是不可能的。 stackoverflow.com/questions/16153314/….
  • @SableFoste:我相信你的问题甚至有一个答案,其中async 仍然是正确的。 99% 的时间是不必要的。
  • @SableFoste:$.when($.ajax({blah})).then(function() {blah; });。以这种方式定义两个回调将意味着它们都在彼此的范围内,允许您在它们之间传递 myresult 但不返回它。案件结案。
  • 详细说明:如果您正在执行瀑布流程,请考虑$.when().then()。如果您要返回,请考虑回调。如果您在请求终止时触发某些事情,请考虑瀑布流程。
  • @SébastienRenauld,那么当您无法链接时,这将如何运作?在我引用的问题中,回调是在对话框中的beforeClose 函数中设置的。尝试链接 dialog 函数将在盒子被激活时引起动作,而不仅仅是在关闭之前......
【解决方案2】:

如果您想实现异步调用,那么您希望将所有要使用结果数据完成的逻辑组织到 .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 对象会很有帮助,这样多个其他函数可以在需要时使用相同的请求。

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 2015-03-30
      • 1970-01-01
      • 1970-01-01
      • 2019-01-30
      • 2017-02-20
      • 1970-01-01
      • 1970-01-01
      • 2015-08-23
      相关资源
      最近更新 更多