【问题标题】:Promise inside forEach loop within promise, bad firebase database design?承诺中的 forEach 循环中的承诺,糟糕的 Firebase 数据库设计?
【发布时间】:2018-02-21 22:23:31
【问题描述】:

我正在使用 Firebase 构建一个购物车,当用户支付了一个功能触发器并且我从购物车中获取了所有商品然后我创建了一系列产品 ID(pid)之后,我想搜索商店 ID每个项目都通知他们。

商店 ID 是产品节点中的子节点。 产品->{pid}->sid

这就是我得到pid后的做法

.then(snap => {
        return pids.forEach( pids => {
            productIdRef = root.child(`/products/${pids}`);
             //Here I should create a promise to get the Stores Ids:
             // productIdRef.once("value")....
        });

这是嵌套的承诺,据我所知并不好。

那么我可以做些什么来避免嵌套承诺,或者这是否由于 Firebase 数据库设计不佳而从一开始就注定了?

更新:完整功能:

    var itemsRef = NOTIFICATION_SNAPSHOT.adminRef.parent.child('items');
    var pids = [];
    return itemsRef.once('value').then(snapshot => {
        return snapshot.forEach((childSnapshot) => {
         pids.push(childSnapshot.key);
        });

    }).then(snap => {
        return pids.forEach(pids => {
            productIdRef= root.child(`/products/${pids}`).once('value');

        });

    }).catch(error => {
        // Something went wrong.
        console.error(error);
      });

【问题讨论】:

  • 我看不到你在这里对你的承诺做了什么,我不确定你所说的“嵌套”是什么意思。你能更完整地展示你所做的事情吗?
  • 是什么让你觉得嵌套 promise 不好?你认为嵌套循环也很糟糕吗?
  • 我知道这无关紧要,但我建议将完善的 SQL 用于购物车目的。否则你最终会得到很多要维护的引用。
  • @Bergi 我认为嵌套 promise 不好,因为我收到了来自 Eslint 的警告,如果您确定不是问题,那么我可以忽略此警告
  • 哦,谢谢@user1027620 的建议,我虽然在firebase上可能是一样的。

标签: javascript firebase firebase-realtime-database google-cloud-functions


【解决方案1】:

我不确定你所说的嵌套是什么意思

也许像下面这样使用Promise.all

.then(snap => {
    return Promise.all(pids.map(pid => {
        return root.child(`/products/${pid}`);
    }));
}).then((storeIds) => {
    // result of root.child()
});

【讨论】:

  • 我以前从未使用过 .maps,所以让我阅读一些文档,看看你在那儿做了什么,jeje。
  • map 是一种将数组转换为另一个数组的方法,在这种情况下,将产品 id 数组转换为 Promise 数组,more info 与 map 一起,您可能还想查找filterreduce
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-25
  • 1970-01-01
相关资源
最近更新 更多