我的网站上有日历控件。它使用一些ajax请求从服务器获取一些可用性数据。 这是代码 -
var monthlyBookingDetails = getBooking(month, year);//getBooking is ajax function
//rest of code
在getBooking
函数中,如果我使async:false,它可以工作,但浏览器被阻塞,直到ajax请求得到服务。
所以我想到了转身 -
while(monthlyBookingDetails.length <= 0){//busy waiting}
但我觉得这不是正确的方法,所以只想了解忙于等待的正确方法是什么,并阻止以下行执行。
答案 0 :(得分:1)
此代码存在问题,您说得对:
while(monthlyBookingDetails.length <= 0){//busy waiting}
这表示“在monthlyBookingDetails
小于或等于0
之前执行无限循环”。故意引入无限循环(即使它们最终被打破)也不太可能是明智之举。特别是因为,如果您的AJAX失败,无限循环将不会被破坏。
正确的方法是采用异步方式。这意味着回调。这意味着提供在异步代码完成时调用的函数。
所以在getBooking
内你会这样做:
function getBooking(month, year, callback) {
$.ajax({
/* all your settings */
success: function() {
callback(); // call the callback function
}
});
}
然后您将调用此函数:
getBooking(month, year, function() {
/* your code here */
});
如果你使用了很多jQuery,你可能会对这个模式很熟悉。它存在于各种异步动作中,例如, AJAX和动画。
您几乎肯定希望将数据传递给回调。您可以这样做:callback(data)
和getBooking(month, year, function(data) {
。