使用jQuery在函数之间传递变量

时间:2018-01-09 09:59:14

标签: javascript jquery

我无法将变量从一个函数传递到另一个函数。

此代码来自我正在处理的PhoneGap应用,其想法是使用 offlineScan 功能扫描QR码,该功能调用 checkforOfflineTicket 来检查本地存储用于票证验证并返回变量 ticketCheck 以确定是否接受票证。

我的代码如下:

function checkforOfflineTicket(ticketID){
  var ticketCheck = '1';
  db = openDatabase(shortName, version, displayName,maxSize);
  db.transaction(function(transaction) {
    transaction.executeSql('SELECT * FROM tickets where ticketid=(?)', [ticketID],
    function(transaction, result) {
      if (result.rows.length == '1') {
        if(result.rows.item(0)['status'] == '0'){
          ticketCheck = 'OK';
        }
        else if(result.rows.item(0)['status'] == '1'){
          ticketCheck = 'DUPLICATE';
        }
        else{
          ticketCheck = 'ERROR';
        }
      }
      else{
        ticketCheck = 'NONE';
      }
      alert('the ticket check is '+ticketCheck);
   },function(transaction, error) {
     console.log("Error processing SQL: "+error.message);
  });
  },errorHandler,nullHandler);
  return ticketCheck;
};

function offlineScan(){
    cordova.plugins.barcodeScanner.scan(
        function (result) {
            if(!result.cancelled){
              if(result.format == "QR_CODE"){
                var ticketCheck = 'test';
                var ticketID = result.text; // The ticketID is the full url
                values=ticketID.split('='); // Split it at = to get the tickethash
                one=values[0]; // url
                two=values[1]; // hash
                ticketCheck = checkforOfflineTicket(two);
                alert('ticket check should be '+ ticketCheck);

            } // End if result is QR
          }
        },
        function (error) {
            alert("Scanning failed: " + error);
        }
   );
}

checkforOfflineTicket 功能当前正在返回警报票证检查正常,然后 offlineScan 功能中的第二个警报返回票证检查应该是未定义的。我已经尝试在不同的地方返回变量,但无论我把它放在哪里都没有传递给offlineScan函数。

我错过了什么?谢谢你的帮助!

1 个答案:

答案 0 :(得分:0)

这是由代码中的异步方法调用引起的。在checkforOfflineTicket中,获取结果集和执行警报的函数与您的offlineScan函数异步调用。您必须链接您的函数以获得正确的执行顺序。以下显示了一种可能的链接方式:

function checkforOfflineTicket(ticketID, callback) {
    var ticketCheck = '1';
    db = openDatabase(shortName, version, displayName,maxSize);
    db.transaction(function(transaction) {
        transaction.executeSql('SELECT * FROM tickets where ticketid=(?)', [ticketID],
        function(transaction, result) {
            ...
            alert('the ticket check is '+ticketCheck);
            if (callback) callback();
        }, ...
    }
}

function offlineScan(){
    cordova.plugins.barcodeScanner.scan(
        function (result) {
            if(!result.cancelled){
                if(result.format == "QR_CODE"){
                    ...
                    ticketCheck = checkforOfflineTicket(two, function() {
                        alert('ticket check should be '+ ticketCheck);
                    );
                } // End if result is QR
            }
        },
        function (error) {
            alert("Scanning failed: " + error);
        }
   );
}