从SQLite中提取数据

时间:2014-07-12 12:34:35

标签: javascript database sqlite nonblocking web-sql

我有一个问题,不知道如何解决它。

我正在开发一个小型Web应用程序。在应用程序中有一个发布系统 用户可以在哪里发表文章。现在,当用户登录时,我保存 他的电子邮件(每个用户都是独一无二的)在SQLite数据库中,当用户添加帖子时,我将所有数据从“发布表单”和他的电子邮件发送到服务器(然后我将其保存在mongoDB中)。问题是电子邮件始终未定义。以下是代码的相关部分:

从数据库中提取数据

function extractDetalisFromDB(){
    db.transaction(queryDB, errorCB);
}


// Extracting the relevant data - there is always only one user in the db, hence the 'id=1'
function queryDB(tx) {
    tx.executeSql('SELECT * FROM currentUser WHERE id=1', [], querySuccess, onError);
}


function querySuccess(tx, results) {
   var len = results.rows.length;
   currentUserName = results.rows.item(0).name;
   currentUserEmail = results.rows.item(0).data;
}

currentUserName和currentUserEmail是全局变量。

验证并发布表格

function validateNewPost() {
    // Here I validate the data from the form... works well.

    if(error_appear === "false") {
        extractDetalisFromDB();
        console.log(currentUserName + ' ' + currentUserEmail);  // This is undefined
        var newPostJson = { writer: currentUserEmail, title: title.value, artist: artist.value,            
                           albumOrSong: albumSong.value, content: content.value, genre: 
                           genre.value};        

        $.post(URLAddress + '/addPost', newPostJson).done(function(data) {});
        window.location = '#index';
    }
}

问题是:

控制台日志和我发送给服务器的数据总是未定义的,因为它发生在从SQLite结束检索数据的回调函数之前。

我应该如何重构我的代码,以便从db中提取结束,然后才将数据发送到服务器? 我抬头看了这个问题,但找不到答案。

1 个答案:

答案 0 :(得分:1)

这是JavaScript中的常见问题,因为它具有同步性。建议的解决方案是将回调传递给异步方法,并在成功时触发它。

因此,查看您的代码,您可以将其重新设计为

function extractDetailsFromDB(callback) {
    db.transaction(function(tx) {
        tx.executeSql('SELECT * FROM currentUser WHERE id=1', [], function(tx, results) {
            var len = results.rows.length;
            currentUserName = results.rows.item(0).name;
            currentUserEmail = results.rows.item(0).data;
            callback();
        }, onError);
    }, errorCb);
}
...
extractDetailsFromDb(function() {
    console.log(currentUserName + ' ' + currentUserEmail);  // This is undefined
    var newPostJson = { writer: currentUserEmail, title: title.value, artist: artist.value,            
                       albumOrSong: albumSong.value, content: content.value, genre: 
                       genre.value};        

    $.post(URLAddress + '/addPost', newPostJson).done(function(data) {});
    window.location = '#index';
});