0

データベース内の行数を数えて結果を返す単純な関数があります。ただし、結果を console.log にしても、結果は関数内から正しく返されますが、結果は未定義として返されます。簡単にするために多くのコードを削除しましたが、これが私がやっていることの要点です。

$('#roomsList').append(getCount(currentRow.roomtype));


function getCount(roomtype) {
var query = "SELECT COUNT(*) FROM fixturesfittings WHERE roomtype = ?;"
localDatabase.transaction(function (trxn) {
    trxn.executeSql(query, [propertyid,roomtype],function (transaction, results) {
       return results.rows.item(0)["COUNT(*)"];
    },errorHandler);
});
}

誰でも私を助けることができますか?

4

2 に答える 2

1

問題はlocalDataBase.transaction非同期exequteSql関数です。それらはすぐには答えを得られないため、関数をそれらに渡します。回答が得られると、コールバックと呼ばれる関数が呼び出されます。これは、実行サイクルの後の時点で発生しgetCountます。

そのため、動作するようになりgetCountますlocalDatabase.transactionが、すぐに利用できるものがないためgetCount、データが利用可能になる前に終了し、getCount未定義 (JavaScript 関数のデフォルトの戻り値) を返します。

おそらく、コードを次のように作り直す必要があります。

getCount(function(count) {
    $('#roomsList').append(count);
});

function getCount(callback) {
    var query = '...';
    localDatabase.transaction(function(trxn) {
        trxn.exequteSql(query, ...  function(transaction, results) {
            callback(results);
        });
    }
}

これは非常に一般的な JavaScript のパターンであり、多くの落とし穴や奇妙な点があります。慣れが必要です。

于 2013-01-05T16:38:05.223 に答える
0

あなたがしていることには、2つの等しく深刻な問題があります。

  1. 外部関数は何も返しません。コード内の唯一のreturnステートメントは、に渡される内部localDatabase.transaction関数から戻ることです。

    このようなもの:

    function myFunction
      inner_function = function () {
        return 3; # Return from inner function, *not* myFunction
      }
    }
    
  2. 内側の関数から外側の関数に値を伝えようとしていて、外側の関数から戻ってきたとしても、それは機能しません。内部関数が非同期で呼び出されています。そのインナーは、が実行を終了して返さreturn results...れたずっと後、将来のある時点で呼び出されています。何らかの形式のコールバックを;に渡す必要があります。コールバックは後で呼び出され、カウントが渡されます。次のように考えてください。getCountundefinedgetCount

    function myFunc(callback) {
    
      function inner_function = function(callback) {
        // Invoke our callback sometime in the future
        setTimeout(1000, callback);
      }
    
      // Inner function does some processing at some future time;
      // give it a callback to invoke when its processing is done
      inner_function(callback);
    }
    
于 2013-01-05T16:41:33.070 に答える