从函数返回变量

时间:2013-03-11 17:39:00

标签: javascript function

我猜这是一个非常简单的(但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 :(
}

3 个答案:

答案 0 :(得分:4)

你可能无法做到,因为你现在有东西。由于JS默认是异步的,因此即使在任何回调运行之前,也会返回rows。由于成功回调是设置 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的第二个参数。只要知道它将通过所有三个args,这个函数的调用者不应该关心。 :P

答案 1 :(得分: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 :(
}

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

答案 2 :(得分:0)

小改变......

function myFunction(){
    var rows;

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

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