首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Firebase web应用程序中连接两个承诺

在Firebase web应用程序中连接两个承诺
EN

Stack Overflow用户
提问于 2020-05-31 10:40:08
回答 2查看 42关注 0票数 0

我正在使用一个实时数据库来处理一些数据在Firebase web应用程序中。在下面的代码中,只有当fieldOne和fieldTwo不被复制时,我才希望在DB中插入一条记录。

代码语言:javascript
复制
dbReference.orderByChild("fieldOne").equalTo(fieldOneVal).once('value')
.then(function(snapshot) {
  if (snapshot.exists()) {
    alert('This fieldOne has already been used.')
    reject();
  }
}).then( // What is the correct way to connect this line and the following ??
dbReference.orderByChild("fieldTwo").equalTo(fieldTwoVal).once('value')
.then(function(snapshot) {
  if (snapshot.exists()) {
    alert('This NAME has already been used.')
    reject();
  }

  // All is now OK.
  .... do the final things here .....
}).catch(function(error) {
  // An error happened.
  alert('This record cannot be inserted.')
});

在这一点上,我能够调整代码,使事情按照我所希望的方式工作。但我的问题是,我没有按照正确的方式做事(我知道,由于一些信息,我可以在控制台上看到)。代码中的注释显示了我需要知道连接这两个部分的正确方法。什么是..。下面这个?

有关信息,DB如下所示:

代码语言:javascript
复制
MyList
  + -M93j....443cxYYDSN
      fieldOne: "asdc..."
      fieldTwo: "Gkk...."
  + -M94j.........OZS6FL
      fieldOne: "afc..."
      fieldTwo: "SDFSk...."
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-05-31 13:05:01

下面的承诺链接与错误抛出相结合,应该可以做到这一点。

代码语言:javascript
复制
  dbReference
    .orderByChild('fieldOne')
    .equalTo(fieldOneVal)
    .once('value')
    .then(function (snapshot) {
      if (snapshot.exists()) {
        throw new Error('fieldOneExists');
      }
      return dbReference
        .orderByChild('fieldTwo')
        .equalTo(fieldTwoVal)
        .once('value');
    })
    .then(function (snapshot) {
      if (snapshot.exists()) {
        throw new Error('fieldTwoExists');
      }

      // All is now OK.
      //.... do the final things here .....
    })
    .catch(function (error) {
      if (
        error.message === 'fieldOneExists' ||
        error.message === 'fieldTwoExists'
      ) {
        console.log('This record cannot be inserted');
      } else {
        console.log('other error');
      }
    });

但是,最好使用事务来检查fieldOnefieldTwo字段的两个值是否存在。

问题是实时数据库事务不能处理查询:您需要准确地知道要修改的数据的位置(或者检查是否存在/不存在)。因此,如果您确实需要一个事务(这取决于您的确切的全局需求),则需要调整您的数据模型。

例如,您可以创建数据库节点,并将fieldOnefieldTwo值的值连接起来,并检查事务中是否存在这样的节点。但是,同样,这种方法的可行性取决于您的确切全局需求,而我们不知道这一点。

票数 1
EN

Stack Overflow用户

发布于 2020-05-31 12:01:47

尝试hasChild()方法。

代码语言:javascript
复制
if(snapshot.hasChild('name') {
   // ... do stuff !
}

或,

在您的firebase实时数据库中创建一个名为用户名的新节点,并在此列表中添加每个用户名。在插入新用户名之前,请检查它是否存在于此列表中

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62114960

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档