随叫随到云功能 不要等待承诺完成



我有一个函数,它总是在返回结果之前完成。我尝试了很多在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之前先研究一下它们是如何工作的,因为您的代码似乎是基于不完整和不正确的理解。

相关内容

  • 没有找到相关文章

最新更新