2012-07-03 35 views
0

这很容易吗?看起来handleResult方法只在结果不是空集时执行。确定SQL选择是否异步返回空集?

我想过的是让handleResult和handleCompletion成为一个对象的成员函数,并让handleResult更新handleCompletion可以检查的成员变量。如果变量被设置,而不是空的,如果变量未设置,则为空并且可以相应地执行。

似乎过于复杂,希望有更好的解决方案?

回答

1

勾勒出一个解决方案(本以为我上面有)(EDIT2:每评论我下面进行)

function sql() { 
    this.results = false; 
    var me = this; 

    this.handleResult = function(aResultSet) { 

     for (var row = aResultSet.getNextRow(); row; row = aResultSet.getNextRow()) { 
      me.results = true; 

      var value = row.getResultByName("name"); 
     } 
    }; 

    this.handleError = function(aError) { 
     .... //deal with error 
    }; 

    this.handleCompletion = function(aReason) { 
     if (me.results) { 
      ....//results 
     } else { 
      ....//no results 
     } 

     if (aReason != Components.interfaces.mozIStorageStatementCallback.REASON_FINISHED) { 
      ....//handle these 
    }; 
}; 

s = new sql(); 

statement.executeAsync({ 
    handleResult: s.handleResult, 
    handleError: s.handleError, 
    handleCompletion: s.handleCompletion 
}); 

这被认为是解决这一问题的好办法?

edit1:这不表现出我期望的方式(它的工作原理,但不是100%肯定为什么)。即,如果handleResult永远不会运行,则this.results变量是未定义的(不是false)。所以它看起来好像handleResult和handleCompletion在一个不同于我预期的变量集合上运行。

任何帮助了解我做错了什么将不胜感激。

+0

http://w3future.com/html/stories/callbacks.xml是我的问题的答案。 需要var me = this;在sql对象和引用内部变量中由“我”。而不是“这个”。 – spotter