2016-12-12 44 views
0

在下面的函數中,如何告訴JS在繼續執行sql事務之前等待我的ajax調用的返回。 下面的示例代碼目前得到的數據正確,但SQL事務在AJAX之前調用填充執行我employees []Jquery在executeSQL之前等待JSON對象的返回

我嘗試把更迭後的SQL操作,但我得到了以下錯誤

Uncaught DOMException: Failed to execute 'executeSql' on 'SQLTransaction': SQL execution is disallowed. 

這裏是代碼的一部分

var addSampleData = function (tx, employees) { 

     var employees = []; 

$.ajax({ 
      url: 'my-path-to-my-json-answer', 
      success: function (value, status) { 
      employees.push(value); 
     }, 
     error: function (XMLHttpRequest, textStatus, exception) { 
      console.log("Connection with the server fail.\n" + textStatus + 'status is: ' + exception); 
     } 
    }); 

     var l = employees.length; 

     var sql = "INSERT OR REPLACE INTO leaderboard " + 
     "(id, uFname, uLname, uRegion, uCountry, uScore) " + 
     "VALUES (?,?,?,?,?,?)"; 

     var e; 

     for (var i = 0; i < l; i = i + 1) { 
      e = employees[i]; 
      tx.executeSql(sql, [e.id, e.uFname, e.uLname, e.uRegion, e.uCountry, e.uScore], 
       function() { 
        console.log('INSERT success'); 
       }, 
       function (tx, error) { 
        console.log('INSERT error: ' + error.message); 
       }); 
     } 

    } 

任何建議,以改善該代碼是值得歡迎的。

+0

使用'.done'搜索的jQuery的承諾語法 – Viney

+0

觸發來自「成功」函數的SQL調用(直接在函數中編碼,或者將調用放到另一個運行查詢的函數中)。該回調僅在從服務器收到響應後才執行。 Ajax是異步的。從概念上講,你不能「告訴其他代碼等待」,你可以簡單地「直到ajax完成才執行它」 - 唯一的方法就是通過「成功」回調(或者通過.done(),如果你使用Promise界面)。 – ADyson

+0

除上述內容外:爲什麼您需要重新定義參數員工?您還應該考慮[this](http://stackoverflow.com/questions/27142680/json-data-insert-sqlit-database-not-working),具體取決於整個應用程序的行爲。 – Ceredig

回答

0

這是因爲Ajax調用是異步的,瀏覽器爲ajax調用啓動一個單獨的線程。爲了Ajax調用完成後,執行SQL查詢,投入到SQL查詢代碼需要的代碼在阿賈克斯如下的成功方法...

jQuery.ajax({ 
     type:"post", 
     dataType:"json", 
     url: myAjax.ajaxurl, 
     data: {action: 'submit_data', info: info}, 
     success: function(data) { 
      //do your SQL work here... 
      console.log('doing SQL work'); 
     }, 
     error: function(data) { 
      console.log('boo...boo...'); 
     }, 
    }); 
相關問題