我的问题由两部分组成。
在我的网页中,我使用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根据信息。
所以我的问题是。
答案 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 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,房门,车门或任何其他可锁定项目。