Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/378.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript asnyc:false真的那么糟糕吗?_Javascript_Jquery_Html_Ajax - Fatal编程技术网

Javascript asnyc:false真的那么糟糕吗?

Javascript asnyc:false真的那么糟糕吗?,javascript,jquery,html,ajax,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>

我的问题由两部分组成

在我的网页中,我正在使用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)(顺便说一句,这是对服务器的post调用),并从db获取信息,然后根据信息创建div

所以我的问题是

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

如果您想要更好的解决方案,我认为您应该考虑javascript承诺。这是一个很好的开始

使用AJAX
success
error
的回调。如果您使用的是同步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、房门、车门或任何其他可锁定的项目。

没有人愿意使用经常出现1-3秒无响应的UI。他们更愿意使用一个即使在做事的时候也能保持活力的网站。其实就这么简单

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

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

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

在数据返回后,始终可以使用回调来执行操作。这是您应该做的,而不是关闭异步。方法是利用回调机制。锁定UI总是不好的。您的代码可以从一些重构中受益,比如在createDiv.js的成功回调中执行useThatDivs.js的内容为什么不使用done、fail等回调@Andrew但是如果我的所有其他脚本都依赖于第一个createDiv.js,它不会破坏模块性吗?我的意思是scriptA对这些div做了一些事情,scriptB做了一些其他的事情。将所有内容都放在回调中,这真的是一种好的做法吗?“锁定网站的所有界面”并不是真正发生的事情。在同步ajax调用完成之前,当前用户的浏览器(在某些浏览器中只有当前选项卡)将被锁定。是的,这是不受欢迎的,但并不是你们描述的那个样。@jfriend00我并不是说,所有的浏览器都会挂起,只有当前打开的网站标签。如果在回复的开始和结束之间有延迟(比如20秒或更多),那肯定不是你想要的,我认为你也会失去客户。你说“你正在锁定网站的所有界面”。如果你的意思是浏览器中只有“打开”选项卡,那么也许你应该编辑你的问题,改为这样说。