Javascript函数不返回查询结果(Cordite的SQLitePlugin)

时间:2014-10-17 09:01:36

标签: javascript sqlite cordova asynchronous

我需要你的帮助来创建一个允许发送查询并返回结果的SQLite类。

我知道transaction / executionql是异步的,我正在尝试解决这个问题。

我写了这段代码:

function SQLite(pName){
    this.result = null;

    //External function
    this.Query = function(pQueryStr) {
        this.result = null;
        execQuery(pQueryStr);
        //Waiting query result. While is null, sleep...
        while(this.result == null){null;} //This line doesn't work
        return this.result;
    }

    //Internal function for execute query
    function execQuery(pQueryStr) {
        //Emulating transacion-executesql functions with lag
        setTimeout(function(){
            this.result = "my query result";
        }, 3000);
    }
}

db = new SQLite("dbName");
var res = db.Query("query request string");
//As I can't wait for SQL result, 'res' returns null.
alert("External result: " + res);

这不起作用,但在评论的同时,' line ...这样可以将此代码添加到结尾。

setTimeout(function(){
    alert("External result (with lag): " + this.result);
}, 5000);

我的问题:我需要'而#39;。此make函数等待查询结果报告。

任何解决方案或解决方法?

谢谢你的时间!

1 个答案:

答案 0 :(得分:1)

我建议使用回调或承诺后者是我更喜欢的https://www.promisejs.org/是一个好的起点。

如果您仍然坚持使用while(这很糟糕,因为您的应用程序将挂起,直到结果返回)。你的while循环不起作用

setTimeout(function(){
        this.result = "my query result";
    }, 3000);

因为这个上下文已经改变了(更多关于这个:http://ryanmorr.com/understanding-scope-and-context-in-javascript/),你要么必须在外部范围声明这个属性,要么绑定这个上下文

function execQuery(pQueryStr) {
    var that = this;
    //Emulating transacion-executesql functions with lag
    setTimeout(function(){
        that.result = "my query result";
    }, 3000);
}

你也需要进行递归检查而不是while,例如:

var that = this;
function checkResult() {
    if (that.result == null) {
        console.log('repeat')
        setTimeout(checkResult,1);
    }
    else {
        console.log('success');
    }
}
checkResult();
setTimeout(function() { that.result = true; },100)