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返回 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 模式,它有很多陷阱和奇怪之处。这需要一些时间来适应。

于 2013-01-05T16:38:05.223 回答
0

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

  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 回答