2013-03-12 50 views
1

我有一個similar question here,但我想我會問一個不同的方式來建立更廣泛的網絡。我還沒有遇到可行的解決方案(我知道)。

我希望XCode發出JavaScript命令並從executeSql回調中獲取返回值。

從我一直在閱讀的研究中,我無法發出同步executeSql命令。我最近來到的是試圖旋轉鎖定,直到我得到回調。但那還沒有奏效。也許我的紡紗沒有給回調機會回來(見下面的代碼)。

問:jQuery如何在Ajax中使用async = false參數? XHR和executeSql命令有什麼不同嗎?

這是我證明了概念至今:(大家不要笑)

// First define any dom elements that are referenced more than once. 
var dom = {}; 
dom.TestID = $('#TestID'); // <input id="TestID"> 
dom.msg = $('#msg'); // <div id="msg"></div> 

window.dbo = openDatabase('POC','1.0','Proof-Of-Concept', 1024*1024); // 1MB 

!function($, window, undefined) { 
    var Variables = {}; // Variables that are to be passed from one function to another. 

    Variables.Ready = new $.Deferred(); 
    Variables.DropTableDeferred = new $.Deferred(); 
    Variables.CreateTableDeferred = new $.Deferred(); 
    window.dbo.transaction(function(myTrans) { 
     myTrans.executeSql(
      'drop table Test;', 
      [], 
      Variables.DropTableDeferred.resolve() 
      // ,WebSqlError 
     ); 
    }); 
    $.when(Variables.DropTableDeferred).done(function() { 
     window.dbo.transaction(function(myTrans) { 
      myTrans.executeSql(
       'CREATE TABLE IF NOT EXISTS Test' 
       + '(TestID Integer NOT NULL PRIMARY KEY' 
       + ',TestSort Int' 
       + ');', 
       [], 
       Variables.CreateTableDeferred.resolve(), 
       WebSqlError 
      ); 
     }); 
    }); 

    $.when(Variables.CreateTableDeferred).done(function() { 
     for (var i=0;i < 10;i++) { 
      myFunction(i); 
     }; 
     Variables.Ready.resolve(); 
     function myFunction(i) { 
      window.dbo.transaction(function(myTrans) { 
       myTrans.executeSql(
        'INSERT INTO Test(TestID,TestSort) VALUES(?,?)', 
        [ 
         i 
         ,i+100000 
        ] 
        ,function() {} 
        ,WebSqlError 
       ) 
      }); 
     }; 
    }); 
    $.when(Variables.Ready).done(function() { 
     $('#Save').removeAttr('disabled'); 
    }); 
}(jQuery, window); 

!function($, window, undefined) { 
    var Variables = {}; 

    $(document).on('click','#Save',function() { 
     var local = {}; 
     local.result = barcode.Scan(dom.TestID.val()); 
     console.log(local.result); 
    }); 


    var mySuccess = function(transaction, argument) { 
     var local = {}; 

     for (local.i=0; local.i < argument.rows.length; local.i++) { 
      local.qry = argument.rows.item(local.i); 
      Variables.result = local.qry.TestSort; 
     } 
     Variables.Return = true; 
    }; 
    var myError = function(transaction, argument) { 
     dom.msg.text(argument.message); 
     Variables.result = ''; 
     Variables.Return = true; 
    } 

    var barcode = {}; 
    barcode.Scan = function(argument) { 
     var local = {}; 

     Variables.result = ''; 
     Variables.Return = false; 
     window.dbo.transaction(function(myTrans) { 
      myTrans.executeSql(
       'SELECT * FROM Test WHERE TestID=?' 
       ,[argument] 
       ,mySuccess 
       ,myError 
      ) 
     }); 
     for (local.I = 0;local.I < 3; local.I++) { // Try a bunch of times. 
      if (Variables.Return) break; // Gets set in mySuccess and myError 
      SpinLock(250); 
     } 
     return Variables.result; 
    } 

    var SpinLock = function(milliseconds) { 
     var local = {}; 
     local.StartTime = Date.now(); 
     do { 
     } while (Date.now() < local.StartTime + milliseconds); 
    } 

    function WebSqlError(tx,result) { 
     if (dom.msg.text()) { 
      dom.msg.append('<br>'); 
     } 
     dom.msg.append(result.message); 
    } 

}(jQuery, window); 
+2

我覺得'不需要new $ .Deferred()''。$ .Deferred()'就夠了 – 2013-03-12 05:12:37

+0

好的,Arun,謝謝。 – 2013-03-12 05:58:09

回答

1

有一些關於XHR不同於存在有關的ExecuteSQL命令?

的種類。

jQuery如何在Ajax中使用async = false參數?

Ajax的,或者更確切地說XMLHttpRequest,並不嚴格地限制於被異步 - 雖然,作爲original acronym建議的,它是優選的。

jQuery.ajax()async選項綁的xhr.open()boolean async說法:

void open(
    DOMString method, 
    DOMString url, 
    optional boolean async, // <--- 
    optional DOMString user, 
    optional DOMString password 
); 

Web SQL Database規範不會還定義了Synchronous database API。然而,這是only availableWorkerUtils接口的實現,主要用於Web Workers定義:

window.dbo = openDatabaseSync('POC','1.0','Proof-Of-Concept', 1024*1024); 

var results; 
window.dbo.transaction(function (trans) { 
    results = trans.executeSql('...'); 
}); 

如果運行該腳本的環境還沒有實現這個接口,那麼你堅持異步API和return荷蘭國際集團的結果將不可行。由於您懷疑的原因,您無法強制阻止/等待異步任務:

也許我的旋轉不給回調機會回來(請參閱下面的代碼)。

+0

我想知道如果不是執行executeSQL,而是對執行了executeSQL的頁面做了ajax async = false,如果這樣會使我的事務同步。 – 2013-03-12 16:45:34

相關問題