2009-04-11 14 views
6

Làm cách nào để nhận được mã JavaScript sau để trả lại row để tôi có thể truy cập nó bên ngoài giao dịch? Tất cả mã ví dụ của Apple dường như có HTML được viết cho trình duyệt trong giao dịch thay vì bao giờ chuyển dữ liệu trở lại chức năng gọi.nhận giao dịch executeSql của Webkit để trả về giá trị

Dọc theo dòng:

function getData() { 
    db.transaction(function(tx) { 
    tx.executeSql("SELECT id FROM table LIMIT 1", [], function(tx, result) { 
     row = result.rows.item(0); 
    }, function(tx, error) { 
    }); 
    }); 

    return row; 
} 

Đây có phải là thậm chí có thể? API lưu trữ Webkit có được đặt thành đồng bộ thay vì thực thi không đồng bộ không?

+0

Bạn đang sử dụng thư viện JavaScript có sẵn công khai? Ví dụ ở đâu? – cgp

+0

Nó không phải là một thư viện, nó được xây dựng trong Webkit. Xem http://developer.apple.com/safari/library/documentation/iPhone/Conceptual/SafariJSDatabaseGuide/UsingtheJavascriptDatabase/chapter_5_section_5.html để biết chi tiết. – ceejayoz

+0

Câu hỏi này đã giúp tôi làm rõ các tham số sẵn có của phương thức executeSql ^^ –

Trả lời

5

Tôi nghĩ bạn muốn tạo một đóng cửa ở đây vì các giá trị đang được thu gom rác/di chuyển ra khỏi chuỗi phạm vi trước khi bạn có thể truy cập chúng. Vượt qua row để đóng cửa để truy cập sau hoặc vào một số chức năng khác có thể xử lý giá trị trong khi vẫn còn trong phạm vi.

Thông tin thêm: Working With Closures

+0

tôi sẽ rất quan tâm đến việc bạn sẽ làm điều đó như thế nào (ý tôi là thông qua việc đóng cửa). Tôi đã thử nhiều lần nhưng không có gì hiệu quả. –

0

tôi đã viết một ví dụ về điều này và giao dịch SQL khác tại địa chỉ: http://wecreategames.com/blog/?p=219

Bạn phải làm WebKit executeSql gọi trong một phong cách không đồng bộ. Để giải quyết vấn đề này, bạn cần có:

thực hiện điều gì đó để cập nhật dữ liệu của bạn. Một cái gì đó như:

function(tx, results) { 
    console.log("Results returned: "+results.rows.length); 
    for (var i=0; i<results.rows.length; i++) { 
     var row = results.rows.item(i); 
     document.getElementById('latestUpdated').innerHTML = row; 
    } 
} 

Lưu ý rằng biến thứ hai vào hàm không phải là lỗi, đó là kết quả.

Tôi đặt trong vòng lặp for để cho thấy rằng có thể có nhiều kết quả trả lại (có lẽ không phải với câu lệnh SQL đó) - vì vậy hy vọng bạn thấy tiện ích của nó.

5

Tôi nhận ra đây là một câu hỏi rất cũ nhưng tôi đã tìm thấy nó khi tìm kiếm cách xử lý các cuộc gọi SQLite không đồng bộ JavaScript. Và câu hỏi cũng giống như tôi và tôi đã tìm thấy một câu trả lời tốt hơn (Mở rộng trên câu trả lời được lựa chọn, sử dụng đóng cửa)

phiên bản của tôi về chức năng getData của bạn là như sau:

function get_option (option, get_option_callback){ 
    if (db === null){ 
     open_database(); 
    } 
    db.transaction(function (tx) { 
     tx.executeSql("SELECT rowid,* FROM app_settings WHERE option = ? ", [option],    
     function(tx, result){ 
      item = result.rows.item(0); 
      get_option_callback(item.value); 
      return; 
     } 
     }, sql_err); 
    }); 
} 

Sau đó, để gọi phương pháp tôi sẽ sử dụng:

get_option("option name", function(val){ 
// set the html element value here with val 
// or do whatever 
$('input[name="some_input"]').val(val); 
}); 
Các vấn đề liên quan