【问题标题】:Is asnyc : false really that bad?asnyc : false 真的那么糟糕吗?
【发布时间】:2014-08-05 16:15:29
【问题描述】:

我的问题由两部分组成。

在我的网页中,我正在使用 ajax post 调用动态创建一些 div,以从 db 获取一些信息。然后我创建我的 div。我的结构如下。

<html>
  <body>
    <script type="text/javascript" src="some.js"></script>
    <script type="text/javascript" src="createDivs.js"></script>
    <script type="text/javascript" src="useThatDivs.js"></script>
    <script type="text/javascript" src="useThatDivsMore.js"></script>
  </body>
</html>

在这里,createDivs.js 使用 async:false 进行 ajax 调用(因为在以后的脚本中,我使用这些 div)(顺便说一句,这是对服务器的后调用),并从 db 获取信息,然后创建根据信息的div。

所以我的问题是。

  • 1) ajax 调用是否应该始终是异步的?然后,我对ajax的使用是 这里完全没用/错了吗?
  • 2) 如果不推荐使用 async:false,我应该使用什么来代替 方法?

【问题讨论】:

  • 数据返回后,您始终可以使用回调来执行操作。这就是你应该做的,而不是关闭异步。
  • 方法是利用回调机制
  • 阻止用户界面总是不好的。您的代码可以从一些重组中受益,例如在 createDivs.js 的成功回调中执行 useThatDivs.js 的内容
  • 为什么不使用done、fail等回调
  • @Andrew 但是如果我所有的其他脚本都依赖于这个第一个 createDiv.js,它不会破坏模块化吗?我的意思是 scriptA 对这些 div 做一些事情,scriptB 做其他事情。把所有东西都放在回调中,真的是一个好习惯吗?

标签: javascript jquery html ajax


【解决方案1】:

如果您想要一个更好的解决方案,我认为您应该研究 javascript 承诺。 Q.js 是一个很好的起点。

【讨论】:

    【解决方案2】:

    没有人喜欢使用经常在 1-3 秒内无响应的 UI。他们更愿意使用一个保持活力的网站,即使他们做事也是如此。真的就这么简单。

    设计异步 Ajax 调用需要更多的工作,但它会产生更好的用户体验。而且,一旦您了解了如何使用可用工具并加以利用,这并不难,只是与同步编程不同。

    由于您使用 jQuery 标记了您的问题,因此您可以使用 jQuery 的 Ajax 支持,并且每个 jQuery Ajax 调用都会返回一个承诺。 Promise 可以使异步编程工作起来更像(尽管不完全相同)同步编程。你可以这样写:

    $.ajax(...).then(function(data) {
        // process results here
    });
    

    如果您想对多个异步操作进行排序,您甚至可以链接 Promise。

    $.ajax(...).then(function(data) {
        // process results here
        // kick off next ajax call
        return $.ajax(...);
    }).then(function(data) {
        // process results of 2nd ajax call        
    });
    

    或者,如果您想启动三个并行异步操作(以获得更好的性能),然后在三个都完成后执行某些操作,您可以这样做:

    $.when($.ajax(...), $.ajax(...), $.ajax(...)).then(function(data1, data2, data3) {
        // process results of all three ajax calls here
    });
    

    哦,如果你想使用 JSONP 之类的东西来做跨域 Ajax/JSON,你只能使用异步。

    【讨论】:

      【解决方案3】:

      使用 AJAX 回调 successerror。如果您使用的是同步 AJAX 调用,那么您将锁定您网站的所有界面,直到所有响应完成。

      $.ajax({
          url: '#',
          data: {id: 1},
          success: function(dataFromServer) {
             callFunctionToProcess(dataFromServer);
             /* OR */
             var directlyProcess = dataFromServer;
          },
          error function(data) {
             var yourRequestHasFailed = true; // e.g. you get 500 server error
          }
      });
      

      为 jfriend00 编辑

      它不会锁定浏览器的任何其他选项卡,因为它不会锁定以下任何一项:操作系统、BIOS、房门、车门或任何其他可锁定的项目。

      【讨论】:

      • “锁定您网站的所有界面”并不是真正发生的事情。当前用户的浏览器(以及某些浏览器中的当前选项卡)将被锁定,直到同步 ajax 调用完成。是的,这是不可取的,但不是你所描述的那样。
      • @jfriend00 我不是说所有浏览器都会挂起,只是当前打开的网站选项卡。如果响应的开始和结束之间存在延迟(例如 20 秒或更长时间),那肯定不是您想要的,我认为您也会失去客户。
      • 您说“您正在锁定您网站的所有界面”。如果您的意思只是浏览器中打开的选项卡,那么也许您应该编辑您的问题来代替。
      猜你喜欢
      • 2014-12-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-04
      • 2011-08-10
      • 2011-03-12
      • 2013-07-19
      • 2013-04-01
      相关资源
      最近更新 更多