函数返回未定义的变量

时间:2013-01-05 16:31:30

标签: javascript jquery

我有一个简单的函数来计算数据库中的行数并返回结果。但是我得到的结果是未定义的,即使我在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);
});
}

任何人都可以帮助我吗?

2 个答案:

答案 0 :(得分:1)

问题是localDataBase.transactionexequteSql是异步函数。他们不会立即得到答案,这就是你将这些功能传递给他们的原因。一旦他们得到答案,他们就会调用你的函数,称为回调函数。这将发生在执行周期的后期,getCount早已过去。

所以getCount调用localDatabase.transaction,它开始工作但没有任何可用的内容,因此getCount在数据可用之前完成,因此getCount是返回undefined(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模式,它有很多陷阱和奇怪之处。这需要一些时间来适应。

答案 1 :(得分:0)

你正在做的事情有两个同样严重的问题:

  1. 您的外部功能不会返回任何内容。代码中唯一的return语句是从传递给localDatabase.transaction内部函数返回。

    这样的事情:

    function myFunction
      inner_function = function () {
        return 3; # Return from inner function, *not* myFunction
      }
    }
    
  2. 即使 试图将内部函数中的值传递给外部函数,然后从外部函数返回,它仍然无效;内部函数是异步调用的。在return results...完成执行并返回getCount之后很久,将在某个时间点调用内部undefined。你需要将某种形式的回调传递给getCount;稍后将调用回调并传递计数。想一想:

    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);
    }