3

从 Firebase DataSnapshot开始,我想要一些东西,用简单的英语,“如果所有孩子都未能满足条件,则执行一些东西”。

这是我现在拥有的:

     appleappsRef.on('value', function (allApplesSnapshot){
            allApplesSnapshot.forEach(function (appleSnapshot) {
                if (condition) {
                   //execute code
                } 
            });             
      });   
4

4 回答 4

3

根据文档,您的 forEach 回调可以返回 true 以取消枚举,而 forEach() 将返回 true 以表示枚举已取消。

这意味着您可以执行以下操作:

appleappsRef.on('value', function (allApplesSnapshot){
  var foundOne = allApplesSnapshot.forEach(function (appleSnapshot) {
    if (condition) {
       return true; // found one, cancel enumeration
    }
  });
  if (!foundOne) {
    // all children failed the condition.
  }
});
于 2012-05-29T00:16:50.490 回答
2
if (allApplesSnapshot.every(function (appleSnapshot) { return !condition; }))
    // ...

Array.every如果数组的每个元素都满足您传递给它的函数,则返回true(也就是说,当传递该元素时,函数返回 true)。因此,要测试每个元素是否符合条件,只需在函数中否定条件即可。

请注意,有些浏览器不支持 Array.every,但每个支持的浏览器也Array.forEach应该支持Array.every

于 2012-05-28T20:32:15.887 回答
2

如果您发现条件为真,您可以使用 .forEach 使用布尔值来跟踪:

 appleappsRef.on('value', function (allApplesSnapshot){
        var foundOne = false;
        allApplesSnapshot.forEach(function (appleSnapshot) {
            if (condition) {
               foundOne = true;
            } 
        });             
        if (!foundOne) {
            // all children failed the condition
        }
  });   
于 2012-05-28T20:57:06.360 回答
0

好吧,您总是可以循环遍历它,并且在任何时候其中一个孩子通过时都会以某种方式退出该方法,否则会触发所有孩子都失败时应该触发的方法。在这种情况下,您甚至可以使用布尔值。

例如:创建一个布尔值并将其命名为 allChildrenFailed,并默认将其设置为 true。通过 foreach 循环,如果有任何子通过,则将其更改为 false。仅当 allChildrenFailed 为真时,才在循环后触发您需要的方法。

于 2012-05-28T20:33:13.443 回答