【问题标题】:getting value from a chained promises从链式承诺中获取价值
【发布时间】:2019-04-26 10:12:56
【问题描述】:

我对这个承诺真的很陌生,我在试图理解这一点时感到头疼,所以现在我试图从一个返回承诺的方法中得到答案,然后我在条件中捕获值并进行一些其他操作

let addService = async(req, res) => {
    checkCategoryExists(param).then(result => {
        if(result){
           // code here
        }
    }).catch(err => console.log(err));
}


let checkCategoryExists = async(param) => {
    let docs = db.collection(collectionName).doc(param);
    docs.get()
        .then(categoryDoc => {
            if(categoryDoc.exists){
                if(categoryDoc.data().param== param){
                    return true;
                }
            } else {
                return false;
            }
        })
        .catch(err => false);
}

“checkCategoryExists”方法是对 Firestore 数据库的查询。当我试图检查结果变量是真还是假时,它恰好是未定义的。我不是用“.then()”从返回的承诺中获取价值吗?如果有人可以帮助我,请提前感谢

【问题讨论】:

  • 我很确定您是否未定义是因为您没有返回查询结果应该是return docs.get().then.....
  • @DLowther 的诊断是正确的。简单的修复是docs.get()...

标签: javascript node.js promise google-cloud-firestore


【解决方案1】:

因此,如上所述,我认为您的问题是基于未返回文档搜索的结果,因此下面的两个示例都可以处理该问题。

我还注意到您在函数上使用了 async 标签,但从未使用 await,因此我想举例说明这两种方法,以防您想使用 Async/Await 但不确定如何使用。

在承诺链示例中,我依靠箭头函数的语法来创建返回(没有{} 表示返回等式的右侧),因为您给定的代码都不需要在返回之前进行数据操作(如果您的实际代码需要你当然应该使用括号并记住你的返回声明:D)

如果您选择使用 Async/Await,您可以将代码结构更接近于同步示例并使用 try catch 语句。有时,如果我必须在返回结果之前进行大量处理/操作,我会发现这种语法更清晰。

祝你好运:)!

// Promise Chains
const addService = (req, res) => 
  checkCategoryExists(param)
    .then(result => /* do stuff */)
    .catch(err => console.error(err.message));
  
const checkCategoryExists = param => 
  db.collection(collectionName.doc(param)
    .get()
    .then(categoryDoc => 
      Promise.resolve((categoryDoc.exists && categoryDoc.data().param === param))
    );
    
// OR using Async/Await
const addService async (req, res) => {
  try {
    const catExists = await checkCategoryExists(param);
    if (!catExists) {
      throw new Error('error code');
    }
    
    // Do Stuff.
  } catch (error) {
    console.error(error);
  }
};

const checkCategoryExists = async param => {
  try {
    const docs = await db.collection(collectionName)
      .doc(param)
      .get();
    
    return (docs.exists && docs.data().param === param);
  } catch (error) { 
    console.error(error) 
  }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-02
    相关资源
    最近更新 更多