javascript - settimeout用法 - settimeout 0




包裝一個異步JavaScript函數使其同步的模式 (5)

如果您使用jQuery Ajax:$ .ajax()

你可以設置異步的屬性為false,然後你將有一個同步ajax請求到服務器。

我正在使用JavaScript API,其中大部分功能是異步的。 API是WebKit JavaScript數據庫API ,它是綁定到操作SQLite3數據庫的一部分功能的。 我了解設計的決定,使異步的東西不阻止和提供一個響應式用戶界面。 在我的情況下,我知道我的異步API調用的使用將執行得很快。 由於這種情況,我想為我的開發人員提供一個更簡潔,更易於使用的包裝器API來強制同步調用。

這是異步調用

db.executeSql(sqlStatement, function(result) {
  // do something with result
});

這就是我想要做的

var result = dbWrapper.executeSql(sqlStatement);
// do something with result

有沒有設計模式/方法來做到這一點? 書面或鏈接到代碼示例是首選。 目標平台/ broswer是iPhone上的Mobile Safari。

謝謝


對不起,JavaScript不提供語言原語(如線程或協程)來使異步事件同步進行,反之亦然。

您通常只會得到一個執行線程,因此您無法從計時器或XMLHttpRequest readystatechange中獲取回調,直到導致創建請求的調用堆棧完全解除為止。

所以總之,你真的不能這樣做; 在鏈接的WebKit頁面上嵌套閉包的方法是我知道在這種情況下使代碼可讀的唯一方法。

*:除了在一些晦澀難懂的情況下,這些情況不會對您有所幫助,通常被認為是錯誤的


你可以嘗試像這樣:

function synch()
{
    var done = false;
    var returnVal = undefined;

    // asynch takes a callback method
    // that is called when done
    asynch(function(data) {
        returnVal = data;
        done = true;
    });

    while (done == false) {};
    return returnVal;
}

但是,這可能會凍結你的瀏覽器在異步方法的持續時間...

或者看一下敘述性的JavaScript: 敘述性的JavaScript是對JavaScript語言的一個小的擴展,它支持阻塞異步事件回調的能力。 這使異步代碼清晰可讀,易於理解。

http://neilmix.com/narrativejs/doc/index.html

麥克風


這實際上並沒有實現數據庫查詢的同步操作,但這是我的解決方案,方便管理。 基本上使用調用函數作為回調函數,並測試結果參數。 如果函數接收到結果,則解析它們,否則將自身作為回調函數發送給查詢方法。

 render: function(queryResults){
  if (typeof queryResults != 'undefined'){
   console.log('Query completed!');
   //do what you will with the results (check for query errors here)

  } else {
   console.log('Beginning query...');
   this.db.read(this.render); //db.read is my wrapper method for the sql db, and I'm sending this render method as the callback.
  }
 }

我不知道這是否是正確的地方,但我在這裡尋找在Firefox中進行同步呼叫的答案。 解決辦法是刪除onreadystatechange回調,並直接調用。 這是我發現和我的解決方案同步回電休息服務





mobile-safari