【问题标题】:Exit out of for loop after first condition is true在第一个条件为真后退出 for 循环
【发布时间】:2017-11-28 10:37:15
【问题描述】:

我有一个 Firebase 函数,它触发 onWrite 到数据库上的特定引用,而不是我拍摄另一个引用的快照,如果刚刚添加的值的大小等于快照的大小,我减 1 以快照并再次更新它.但是如果我有多种尺寸和数量,循环会继续并删除所有内容。在满足第一个条件后,我如何退出循环。这是我的代码:

exports.finalizeOrder = functions.database.ref('/orders/{pushId}')
.onWrite(event => {
    var orderData = event.data.val();
    return admin.database().ref('models/').child('females').child(orderData.id).once('value', function(data){
        var dbModel = data.val();
        for(var s = 0;s<dbModel.sizes.length;s++){
            if(Number(orderData.size) === dbModel.sizes[s].size){
                var index = dbModel.sizes.indexOf(dbModel.sizes[s])
                if(dbModel.sizes[s].amount > 0){
                    dbModel.amount = dbModel.amount - 1;
                    dbModel.sizes[s].amount = dbModel.sizes[s].amount -1;
                    if(dbModel.sizes[s].amount === 0){
                        dbModel.sizes.splice(index, 1)
                    }
                }
            }
        }
        admin.database().ref('models/').child('females').child(orderData.id).update(dbModel);
        admin.database().ref('orders').child(event.data.key).update({status: 'proccesing'});
    })
});

【问题讨论】:

  • 您应该使用break; 而不是return;。更多信息w3schools.com/js/js_break.asp
  • 它不适用于break;它立即退出循环
  • 在您的原始问题中,您的第一个 IF 中有一个 return。因此,如前所述:将break; 语句放在您希望函数退出的位置。
  • 它的方法不是循环问题。我正在监听写入,当第一次接收和更新数据时,该函数执行 2 次。我将其更改为 onCreate,它工作正常

标签: javascript firebase firebase-realtime-database


【解决方案1】:

您可以使用布尔标志并在 for 循环的条件语句中检查它。并在满足您的条件时将其设置为 false。在下面的示例中,我将它添加到第一个 if 中。当条件满足时,您可以在 for 循环中的任何位置进行设置。

exports.finalizeOrder = functions.database.ref('/orders/{pushId}')
.onWrite(event => {
    var orderData = event.data.val();
    return admin.database().ref('models/').child('females').child(orderData.id).once('value', function(data){
        var dbModel = data.val();
        var conditionFlag = true; // Set condition flag to be true
        for(var s = 0;s<dbModel.sizes.length && conditionFlag ;s++){
            if(Number(orderData.size) === dbModel.sizes[s].size){
                conditionFlag = false; // Set conditionFlag to false wherever you want inside the loop so that the loop stops
                var index = dbModel.sizes.indexOf(dbModel.sizes[s])
                if(dbModel.sizes[s].amount > 0){
                    dbModel.amount = dbModel.amount - 1;
                    dbModel.sizes[s].amount = dbModel.sizes[s].amount -1;
                    if(dbModel.sizes[s].amount === 0){
                        dbModel.sizes.splice(index, 1)
                    }
                }
            }
        }
        admin.database().ref('models/').child('females').child(orderData.id).update(dbModel);
        admin.database().ref('orders').child(event.data.key).update({status: 'proccesing'});
    })
});

【讨论】:

  • 它做同样的事情
【解决方案2】:

所以这里的问题是我正在监听我指定的数据库引用的 onWrite,这发生在我第一次推送数据和第二次更新它时,这就是它执行该函数两次的原因。我更改了 onWrite使用 onCreate 并且效果很好。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-25
    • 1970-01-01
    • 2018-03-11
    • 2012-03-01
    相关资源
    最近更新 更多