是异步:假真的那么糟糕吗?

时间:2014-08-05 07:25:38

标签: javascript jquery html ajax

我的问题由两部分组成。

在我的网页中,我使用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执行ajax调用:false(因为在以后的脚本中,我使用这些div)(和btw,它是对服务器的调用),并从db获取信息,然后创建div根据信息。

所以我的问题是。

  • 1)ajax调用是否始终是异步的?然后,我对ajax的使用是 完全无用/错在这里?
  • 2)如果async:false被表示,我应该使用什么而不是这个 方法吗

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

没有人更喜欢使用经常无响应的用户界面1-3秒。他们更喜欢使用一个保持活力的网站,即使他们做事也是如此。真的很简单。

设计异步Ajax调用需要花费更多的工作,但它会产生更好的用户体验。而且,一旦你学会了如何利用可用的工具,它就不难,只是与同步编程不同。

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

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

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

$.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,你只能使用异步。

答案 2 :(得分:-1)

使用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,房门,车门或任何其他可锁定项目。