javascript - 我正在尝试调用一个包含 promise 的函数。 JavaScript

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

我正在从另一个名为 setUpData 的函数调用这个名为 numberOfRedeems(dealId) 的函数。请注意,numberOfRedeems() 函数有一个 promise 并返回 "counter"

当我从 setUpData function 运行相同的函数时它总是来undefined 。请告诉我为什么会发生这种情况。将不胜感激!

我怀疑问题是我调用的函数中有一个 promise 。

function getNumberOfRedeems(dealId){

    userId = firebase.auth().currentUser.uid;

    var counter = 0;

    db.collection("redeemedDeals").get()
        .then(function(querySnapshot){
          querySnapshot.forEach(function(doc) {

          var data = doc.data();
          var docDealID = data.deal;

          console.log(docDealID);

          if (dealId == docDealID){
              counter = counter + 1;
          }
        });
      }).then(function(){
        console.log(counter);
        return counter;
      })

  }
function setUpData(){


    $("#uploadingProgress").hide();

    var user = firebase.auth().currentUser
    var userId = user.uid


    var userRef = db.collection('partners').doc(user.uid);
    return userRef
      .get()
      .then(doc => {
        if (doc.exists) {
          try{
          userName = doc.get("name")

          $("#partnerName").show().text(userName);

        }catch(error) {
          console.error("Could not retrieve ", error);}
        }

        db.collection("partners").doc(userId).collection("dealHistory").get()
        .then(function(querySnapshot) {

            querySnapshot.forEach(function(dealHistoryDocRef) {
                db.collection("deals").doc(dealHistoryDocRef.id).get().then(function(doc){

                      var dealId = dealHistoryDocRef.id

                      table.innerHTML +=  "<td><a id="+doc.get("id")+">"+doc.get("name")+"</a></td><td>" + getNumberOfRedeems(dealId) + "</td><td>"+doc.get("id")+"</td>"


                })
             });

        });


  })}

我希望它返回一个数字,但它总是未定义。

最佳答案

首先,您的函数 getNumberOfRedeems 需要是一个 Promise,并从 resolve 返回一个 counter

function getNumberOfRedeems(dealId){
  return new Promise((resolve, reject) => {
    userId = firebase.auth().currentUser.uid;
    var counter = 0;
    db.collection("redeemedDeals").get()
        .then(querySnapshot => {
          querySnapshot.forEach(doc => {

          var data = doc.data();
          var docDealID = data.deal;

          console.log(docDealID);

          if (dealId == docDealID){
              counter = counter + 1;
          }
        });
      }).then(() => {
        console.log(counter);
        resolve(counter);
      })
   })
  }

其次,在调用它的地方,需要 await getNumberOfRedeems 并在函数声明之前添加 async 特定单词,例如:

db.collection("deals")
  .doc(dealHistoryDocRef.id)
  .get()
  .then(async doc => {
       var dealId = dealHistoryDocRef.id
       table.innerHTML +=  "<td><a id="+doc.get("id")+">"+doc.get("name")+"</a> 
       </td><td>" + await getNumberOfRedeems(dealId) + "</td><td>"+doc.get("id")+"</td>"
})

关于javascript - 我正在尝试调用一个包含 promise 的函数。 JavaScript,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57894506/

相关文章:

javascript - 为什么在 JavaScript 中函数既是构造函数又是对象?

node.js - 使用javascript删除mongodb中的内部对象

android FCM 从应用程序设置启用/禁用

ios - FCM 消息的 "icon"属性对 iOS 有影响吗?

javascript - 客户端扇出真的是个好主意吗?

javascript - 为什么这个微任务在事件循环中先于宏任务执行?

javascript - 如何使用带有导入的 Body Parser 而不是必需的? ES6

javascript - 使用 Cloudflare 获取真实的国家/地区

node.js - 使用证书、私钥和 CA 的 AWS Lambda NodeJS 请求

javascript - 链式命令总是按顺序执行吗?