我有一个函数,它总是在返回结果之前完成。我尝试了很多在stackoverflow上找到的解决方案,但这些主题似乎都不起作用。这是我最后一次尝试。你能看到错误在哪里吗?
exports.myFunction = functions.https.onCall((data, context) => {
if (!context.auth.uid) {
return {
status: "NOK",
};
}
Promise.all(
stripe.paymentMethods.attach(data.pm, { customer: data.cust }, function (err, paymentMethod) {
if (err) {
return {
status: "NOK",
};
}
Promise.all([
FIRESTORE.collection("Users")
.doc(context.auth.uid)
.collection("PM")
.doc(paymentMethod.id)
.set(paymentMethod),
FIRESTORE.collection("Users")
.doc(context.auth.uid)
.update({ pm: paymentMethod.id }),
])
return { status: "OK" }
})
)
})
在我返回的数据中,我应该定义"状态",但我只得到数据:空
您需要将函数的顶级代码中的promise返回到Cloud Functions环境。否则,它就无法知道应该等待什么。
此外,您还需要从任何嵌套的异步操作中弹出promise。
最后:如果Stripe API没有返回承诺,您需要自己将其结果转换为承诺。但从我对他们的API文档的阅读来看,它似乎返回了一个承诺,所以您还需要将其与其他承诺联系起来。
因此:
exports.myFunction = functions.https.onCall((data, context) => {
if (!context.auth.uid) {
return {
status: "NOK",
};
}
return Promise.all(
return stripe.paymentMethods.attach(data.pm, { customer: data.cust })
.then(function(paymentMethod) {
return Promise.all([
FIRESTORE.collection("Users")
.doc(context.auth.uid)
.collection("PM")
.doc(paymentMethod.id)
.set(paymentMethod),
FIRESTORE.collection("Users")
.doc(context.auth.uid)
.update({ pm: paymentMethod.id }),
]).then(function() {
return { status: "OK" }
});
})
.catch(function(err) {
if (err) {
return {
status: "NOK",
};
}
});
)
})
我强烈建议您在继续在云函数中使用promise之前先研究一下它们是如何工作的,因为您的代码似乎是基于不完整和不正确的理解。