2012-09-21 139 views
2

我想澄清有關AJAX的東西我在想......好奇AJAX是異步的,並調度/定時器事件

AJAX被說成是異步的 - 如果你希望它是 - 這意味着,如果一個javascript在頁面加載時運行,並且執行AJAX調用時,頁面將繼續加載,而服務器處理AJAX請求...因此,假設它可以被比作僞並行性,那麼安全嗎?

現在,關於兩個不同的javascripts因此做一個AJAX調用呢?也就是說,當頁面加載時,它會遇到兩個js函數,一個接一個地發送一個AJAX調用。由於它們是不同的js函數/或兩個不同的js文件,它們是否必須等待函數返回之前才返回?我認爲是這樣的...

最後真正的問題,我有...如果我有一個js函數調用,並在該函數我觸及兩個AJAX調用,然後將他們半同時處理...因爲我在我的網頁上嘗試了一些東西,偶然發現了兩個AJAX調用,我認爲這是我產生意想不到的結果的原因。不幸的是我在匆忙交付,所以我沒有追求,但我想知道,如果它像世界,因爲這將是某些情況下非常方便...

Somethign這樣

function finalizeReservation(){ 
    var request = $.ajax({ 
     type:  'POST', 
     url:  './scripts/php/reserve.php', 
     data:  { 
       }, 
     dataType: "json" 
    }); 

    request.done(function(data,textStatus,jqXHR) { 

    }); 

    request.fail(function(jqXHR, textStatus, errorThrown) { 
    }); 

    var request2 = $.ajax({ 
     type:  'POST', 
     url:  './scripts/php/reserve.php', 
     data:  { 

       }, 
     dataType: "json" 
    }); 

    request2.done(function(data,textStatus,jqXHR) { 

    }); 

    request2.fail(function(jqXHR, textStatus, errorThrown) { 
    }); 

}

很好奇。

我一直在想,因爲我有一個記錄預訂的網頁。在確定預訂之前,雖然客人可以看到細節並思考問題。在那段時間,數據庫中的插槽被設置爲掛起狀態,並使其他用戶無法使用,因此它們不會在競爭條件下發生衝突或進入(例如,在考慮其他情況時,另一位用戶最終確定它,所以當他試圖自己完成時,他不能或者如果代碼中的粗心也會完成它)。問題出在客人行爲上,儘管我試圖捕獲刷新,反向頁面,退出標籤,關閉窗口類型的所有事件,所以如果客人由於某種原因不關閉形成正確的方式(取消)並非全部都在所有瀏覽器中捕獲。所以我儘管在服務器上設置了一個時間限制,如果它超過了它並且狀態仍然處於等待狀態,那麼狀態就會反轉爲空閒狀態(我有一個分鐘計時器的形式,一分鐘後它會自動關閉並釋放插槽) 。問題是,託管服務器不支持chron作業,儘管我對它們瞭解不多,所以我不確定它們會有多大的幫助,而mysql不支持調度程序。 所以我想做兩個Ajax調用,一個是定時器,在一段時間後會檢查插槽的狀態,並採取相應的行動。

任何想法表示讚賞。 對不起,很長的文章。

+0

你忘了說出乎意料的結果了嗎?或者至少,不清楚;) – dbf

回答

0

你沒有關於Ajax的具體問題,但你似乎對它有很好的理解,並且你所說的一切都是正確的。至少在jQuery中,它默認是異步的,除非你使用Deferred,否則不能保證在ajax調用之後執行的代碼在ajax調用之前不會完成。

你的實際問題似乎是關於如何處理陳舊的鎖保留。幾點建議:

  • 移到另一個共享主機。我每年支付15美元用於允許cron作業的共享主機。
  • 每當有人訪問該頁面時,檢查所有鎖定的預約,並且如果他們足夠大,則假定該鎖定已過時。

另一個Ajax調用也無濟於事。如果他們關閉該頁面會怎麼樣?您可以嘗試使用onbeforeunload來提醒會刪除鎖的對話框,但這非常具有侵擾性。

0

在沒有等待ajax函數完成的情況下,ajax函數將繼續執行,除非下面的代碼位於ajax函數的callback中。