【问题标题】:How to escape forEach returning true or false如何逃避 forEach 返回 true 或 false
【发布时间】:2018-04-03 05:06:21
【问题描述】:

我需要让这段代码工作:

router.post('/checkProduct',function(req,res) {
  ref.child("recipts").once("value",function(usersSnap) {
  var purchasedval = "";
    usersSnap.forEach(function (reciptsSnap) { //for every user
      if(reciptsSnap.key === req.body.userId) {
        reciptsSnap.forEach(function (reciptSnap) {
          reciptSnap.ref.child("latest_receipt_info").once("value",function(b) {
            purchasedval = "false";
            b.forEach(function (c) {
              if(c.val().product_id === req.body.productId && reciptSnap.val().status === "on") {
                purchasedval = "true";
              }
            });
          });
        });
      }
    });
    return res.send({ "alreadyPurchased" : purchasedval })
  });
});

if 部分实际上已经完成,但它返回“”。如果我在 if 中返回,它会说关于设置多次标题的问题,所以这就是为什么我创建一个像 purchaseval 这样的变量,但我不知道在 forEachs 完成后如何设置它。有什么想法吗?

【问题讨论】:

  • 你确定if块语句运行一次吗?
  • if可以多次进入,进入需要返回true
  • 您只需致电res.send 一次即可获得request。你想要这个吗?
  • 我知道它可以只被调用一次......我需要如果它进入 IF 即使只有一次返回 true......如果代码从未进入 if 返回 false......任何想法@saeid?
  • 您可以通过返回true 来突破Firebase Snapshot's forEach,但这对您没有帮助,除非您重组代码,因为您在内部对once 进行异步调用循环 - 这就是为什么 purchasedval""

标签: javascript node.js firebase-realtime-database


【解决方案1】:

您可以为您的 if 块执行此操作:

...
// when you define purchaseval
var perchaseval = false;
var send = false;
...
if(!purchasedval && c.val().product_id === req.body.productId && reciptSnap.val().status === "on") {
  purchasedval = "true";
  send = true;
  res.send({ "alreadyPurchased" : purchasedval });
 }
else if(!send) {
  send = true;
  res.send({ "alreadyPurchased" : purchasedval });
 }

如果你想在res.send 之后跳过forEach,你可以使用Array.prototype.every,在你的if 中你可以使用break。 但我最好的提议是使用像 AsyncPromises 范式这样的模块

【讨论】:

  • 所以我得到了.. FIREBASE 警告:用户回调引发了异常。错误:发送后无法设置标头。并且......错误的结果......应该是真的我认为我需要重组代码
  • 你知道如何使用异步实现吗?
  • 我最终为任何感兴趣的人声明了这个变量
【解决方案2】:

你无法脱离 forEach。您需要使用普通的 for 循环。

【讨论】:

  • 在 firebase 中遍历许多 for 循环是一件非常讨厌的事情...... :(
  • 这和 Firebase 有什么关系?
  • 验证一个 ID 是否存在两个参数的两个值。如果两个值都存在,则返回 true,否则返回 false
猜你喜欢
  • 2020-08-14
  • 2011-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多