2010-07-08 68 views
0

我使用的是HTML5 Web数据库API和我有检查,看看是否应用程序需要去执行它的功能是建立阶段:如何设置与HTML5的Web数据库API状态

this.setupRequired = function() { 
    var status; 
    try { 
     this.db.transaction(function(tx) { 
      tx.executeSql("SELECT * FROM settings", [], function (tx,result) { 
       if (result.rows.length == 0) { 
        status = true; 
       } else { 
        status = false; 
       } 
      }, function(tx) { 
       status = true; 
      }) 
     }); 
    } catch (e) { 
     return true; 
    } 
    return status 
} 

我要根据设置表中是否有数据(或者设置表不存在)来返回true或false。状态var没有设置,我猜这是由于范围问题和匿名回调函数。我很确定我需要在这里使用闭包来纠正问题,但不能完全正确。

回答

0

我想返回true或基于是否有在设置表或数据不

你可以不假。在setupRequired()方法不得不返回时,不知道设置表中是否有数据。只有当SQL数据库执行查询并调用回调函数时才会知道这一点。只有在setupRequired()之后才会发生这种情况,导致它被调用的函数全部退出,并将控制权返回给浏览器。

这就是传递给executeSql()的回调函数的要点。该功能不会马上执行,因此在达到return status时,status将不会被触碰。更重要的是,回调函数中发生的任何异常都不会导致catch(e)块被执行,因为try...catch块在其内部定义的函数实际被调用时将会退出。所以这try...catch是无效的。

这是'异步'编码。仅仅因为某些代码在函数之下,并不意味着该函数将首先执行。

+0

这非常合理,谢谢。 – rjlee 2010-07-08 10:00:09

0

嗯,我没有任何使用此API的经验,但它似乎尝试在回调函数中设置一个值,然后从外部函数返回该值。假设回调是异步的,这是行不通的。我认为最好的办法是给你的代码更改为类似:

this.setupRequired = function() { 
    try { 
     this.db.transaction(function(tx) { 
      tx.executeSql("SELECT * FROM settings", [], function (tx,result) { 
       if (result.rows.length == 0) { 
        doYourSetupFunction(); 
       } else { 
        //don't; 
       } 
      }, function(tx) { 
       doYourSetupFunction(); 
      }) 
     }); 
    } catch (e) { 
     doYourSetupFunction(); 
    } 
} 

从而使setupRequired功能是承担一切检查和触发设置。

+0

谢谢,这就是我原来的想法,并试图摆脱,但正如你所说回调的异步性质意味着它是不可能的,所以我必须回到那个。 – rjlee 2010-07-08 09:59:19

+0

没问题:)可能有更好的解决方案,但我们需要更多地了解其他代码。祝你好运! – Jake 2010-07-08 10:16:20

0

您可以将状态设置为对象的属性或您自己制作的另一个对象。

你也可以在每个阶段检查'this'是什么或使用萤火虫的值状态。