2011-10-19 14 views
6

Tôi đang cố gọi một hàm SELECTS giá trị từ cơ sở dữ liệu SQL Web của tôi. Tôi muốn trả về các giá trị SELECTED thành một biến bên trong hàm cha. Tuy nhiên, biến luôn luôn trả về trống, thời tiết là toàn cục hay không.Giá trị trả về giao dịch SQL Web SELECT

Như bạn có thể thấy console.log bên trong hàm selectRow ghi lại các giá trị chính xác từ truy vấn cơ sở dữ liệu, nhưng console.log hiển thị trống trong hàm initDB.

Tôi cũng nhận thấy rằng nhật ký trống hiển thị trước nhật ký bên trong hàm selectRow. Tôi đã tìm thấy các diễn đàn nơi mọi người đang nói về các giao dịch cơ sở dữ liệu không đồng bộ. Tôi hiểu rằng đây là lý do tại sao biến của tôi được trả về trống. Tuy nhiên, sau khi đánh đầu vào tường nhiều lần, tôi vẫn không thể tìm ra cách để giải quyết vấn đề không đồng bộ này.

/** Initialize Database **/ 
function initDB(){ 
    createTable(); 
    var pleaseWork = selectRow("SELECT * FROM planets;"); 
    console.log(pleaseWork); 
} 

/** Select Row from Table **/ 
function selectRow(query){ 
    var result = []; 

    db.transaction(function (tx) { 
    tx.executeSql(query, [], function(tx, rs){ 
     for(var i=0; i<rs.rows.length; i++) { 
     var row = rs.rows.item(i) 
     result[i] = { 
      id: row['id'], 
      name: row['name'] 
     } 
     } 
     console.log(result); 
    }, errorHandler); 
    }); 

    return result; 
} 

Trả lời

17

Bạn có thể thay đổi chức năng selectRow() bạn để chấp nhận một cuộc gọi lại như một tham số, mà nó sẽ gọi với kết quả chứ không phải trả lại kết quả:

/** Initialize Database **/ 
function initDB(){ 
    createTable(); 
    selectRow("SELECT * FROM planets;", function(pleaseWork) { 
    console.log(pleaseWork); 
    // any further processing here 
    }); 
} 

/** Select Row from Table **/ 
function selectRow(query, callBack){ // <-- extra param 
    var result = []; 
    db.transaction(function (tx) { 
     tx.executeSql(query, [], function(tx, rs){ 
     for(var i=0; i<rs.rows.length; i++) { 
      var row = rs.rows.item(i) 
      result[i] = { id: row['id'], 
          name: row['name'] 
      } 
     } 
     console.log(result); 
     callBack(result); // <-- new bit here 
     }, errorHandler); 
    }); 
} 
+1

Cảm ơn bạn rất nhiều. Callbacks là một khái niệm mới cho tôi nhưng tôi chắc chắn sẽ tìm hiểu thêm về chúng. –

+1

Gọi lại là khái niệm khó nhất để làm quen khi bắt đầu bằng javascript – drinovc

3

này là khó khăn bởi vì bạn có một phản ứng chậm bạn cần đợi phản hồi SQL trước khi trả về dữ liệu, đó là lý do tại sao cần phải chuyển một hàm gọi lại

0

Xem trang web: groups.google.com/forum/?fromgroups#!topic/phonegap/YCRt2Hdu CKG

function loadUniteSelectListe() { 
db.transaction(function (tx) { 
//populate drop down for unites 
    tx.executeSql('SELECT * FROM Unites', [], function (tx, results) { 
     var len = results.rows.length; 
     var i=0; 
     var txt=""; 
     for (i = 0; i < len; i++){ 
      txt=txt + "<option value="+results.rows.item(i).uniteName + ">" + results.rows.item(i).uniteSymbol + "</option>"; 
     } 
     document.getElementById("filtreUniteSelect").innerHTML=txt; 
    }, null); 
    }); 

}

liên quan đến HTML sau:

Unité: <select name="filtreUniteSelect" id="filtreUniteSelect" ></select><br/> 

với bảng: kết hợp

CREATE TABLE IF NOT EXISTS Unites (uniteID INTEGER PRIMARY KEY AUTOINCREMENT, uniteName TEXT, uniteSymbol TEXT) 
    tx.executeSql("INSERT INTO Unites(uniteName,uniteSymbol) VALUES(?, ?)", ['heure', 'h']); //fonctionnel un à la fois 
    tx.executeSql("INSERT INTO Unites(uniteName,uniteSymbol) VALUES(?, ?)", ['kilometre', 'km']); //fonctionnel un à la fois 
    tx.executeSql("INSERT INTO Unites(uniteName,uniteSymbol) VALUES(?, ?)", ['dollar', '$']); //fonctionnel un à la fois 

A +

Các vấn đề liên quan