2009-04-11 52 views
6

我怎樣才能得到下面的JavaScript返回row所以我可以在事務外訪問它?所有Apple的示例代碼似乎都將HTML寫入事務中的瀏覽器,而不是將數據傳回給調用函數。得到一個Webkit的executeSql事務返回一個值

線沿線的:

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; 
} 

這甚至可能嗎? Webkit存儲API可以設置爲同步而不是異步執行?

+0

您使用的是可公開提供的JavaScript庫嗎? 示例在哪裏? – cgp 2009-04-11 17:58:41

+0

這不是一個庫,它是內置於Webkit中的。有關詳細信息,請參閱http://developer.apple.com/safari/library/documentation/iPhone/Conceptual/SafariJSDatabaseGuide/UsingtheJavascriptDatabase/chapter_5_section_5.html。 – ceejayoz 2009-04-11 18:03:06

回答

5

我想你想在這裏創建一個閉包,因爲在訪問它們之前,值正在被垃圾收集/從範圍鏈移開。將row傳遞給稍後訪問的閉包,或者傳遞給某個可以處理該值的其他函數,但它仍處於範圍內。

更多信息:Working With Closures

0

我寫的這個問題和其他SQL事務的例子在:http://wecreategames.com/blog/?p=219

你要做的WebKit的的ExecuteSQL異步樣式要求。爲了解決這個問題,你應該有:

function(tx, error) { 
} 

執行一些更新您的數據。例如:

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; 
    } 
} 

請注意,第二個變量放入函數不是錯誤,它是結果。

我在for循環中顯示可能會返回多個結果(儘管可能不包含該SQL語句) - 所以希望您能看到它的實用性。

5

我意識到這是一個非常古老的問題,但我在尋找如何處理JavaScript異步SQLite調用時發現它。而問題是我的一樣,我已經找到了一個更好的答案(擴展選定的答案,使用閉包)

我對你的getData函數的版本如下:

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); 
    }); 
} 

然後調用我會使用的方法:

get_option("option name", function(val){ 
// set the html element value here with val 
// or do whatever 
$('input[name="some_input"]').val(val); 
});