0

我猜这是一个非常简单的方法(但 JS 不是我最好的朋友,我被困住了......)

我怎样才能返回rows值?(这是未定义的......)

function myFunction(table){
    html5sql.process(
    ["SELECT * FROM "+table],
    function(transaction, results, rowsArray){
        rows = rowsArray; // rows is defined here
    },
    function(error, statement){
    });
    return rows; // rows is not defined here :(
}
4

3 回答 3

4

你可能无法做到这一点,因为你现在有东西。默认情况下,JS 是异步的,rows甚至在任何这些回调运行之前都会返回。由于成功回调是set rows,因此您将始终返回未设置或过时的值。

(注意:我从未使用过 html5sql。可能是该库只是提供了一个看起来异步的接口,而实际上却以某种方式同步工作。但如果确实如此,那么在这方面就很不寻常了。)

一种可能的解决方法是自己进行回调,一旦获得行,您将调用并将其传递给它们。

function myFunction(callback){
    html5sql.process(
    ["SELECT * FROM "+table],
    function(transaction, results, rowsArray){
        callback(rowsArray);
    },
    function(error, statement){
    });
}

// and use it like this
myFunction(function(rows) {
    // do stuff with rows in here
});

或者,如果您想偷懒,只需将callback其用作 的第二个参数。process只要知道它将传递所有三个参数,这个函数的调用者不应该关心这些。:P

于 2013-03-11T17:45:23.383 回答
0

rows在分配它的值之前声明:

function myFunction(){
    var rows;
    html5sql.process(
    ["SELECT * FROM "+table],
    function(transaction, results, rowsArray){
        rows = rowsArray; // rows is defined here
    },
    function(error, statement){
    });
    return rows; // rows is not defined here :(
}

这会改变变量范围,并使其在内部函数外部可见和可访问。

于 2013-03-11T17:40:52.670 回答
0

微小的变化...

function myFunction(){
    var rows;

    html5sql.process(
    ["SELECT * FROM "+table],
    function(transaction, results, rowsArray){
        rows = rowsArray;
    },
    function(error, statement){
    });
    return rows;
}

你得到一个 undefined 因为你还没有真正定义它 - 在函数的开头这样做会使它特定于该范围并且应该正确返回。

于 2013-03-11T17:40:59.087 回答