我正在从另一个名为 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/