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あり、これらのコールバックが実行される前でも返されます。成功コールバックが設定 rowsされるものであるため、常に未設定または古い値のいずれかを返します。

(注:私はhtml5sqlを使用したことがありません。ライブラリは、実際には同期的に動作しているのに、非同期に見えるインターフェイスを提供しているだけかもしれません。しかし、使用している場合は、その点で非常に珍しいでしょう。)

考えられる解決策の1つは、自分でコールバックを取得することです。コールバックを呼び出して、行を取得したらに渡します。

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、の2番目の引数として使用します。processこの関数の呼び出し元が気にする必要のない3つの引数すべてを渡すことを知っておいてください。: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;
}

実際に定義していないため、未定義になっています。関数の先頭で定義すると、そのスコープに固有になり、正しく返されるはずです。

于 2013-03-11T17:40:59.087 に答える