我有这段代码,我需要第二个功能handleRequest
才能首先运行。然后是第二个功能
代码
const db = admin.firestore();
const docRef = db.collection("user").doc(`${UID}`);
let result;
function update() {
db.runTransaction(t => {
return t.get(docRef).then(doc => {
const newValue = doc.data().Funds + result;
t.update(docRef, { Funds: newValue });
return true;
});
})
.then(success => {
console.log("successfully updated");
})
.catch(error => {
console.log(error);
});
}
//the below function runs first and returns a value (data) that is
//needed by the function up top (update)
handleRequest()
.then(data => {
console.log(data);
result = parseFloat(data);
update(); //the update function
return true;
})
.catch(error => {
console.log(error);
});
问题是,一旦我在代码中的Update
函数(异步)中添加了handleRequest
函数,handleRequest
就会失败。
4:36:22.241 PM onOrderCreate Function execution took 869 ms, finished
with status: 'ok'
4:36:21.991 PM onOrderCreate kPlpJCGkJ6XdsJlkxgobM5gHGUd2
//the console.log up top of UID. There is no log of the data from the
//handleRequest function
4:36:21.377 PM onOrderCreate Function execution started
一旦我删除了update
函数,其他handleRequest
函数就成功完成了。我缺少的是,在.then
函数内部添加一个函数会使所有操作失败?
我还尝试了一种变通方法,即将result
函数的结果初始化为handleRequest
变量,如
function update() {
db.runTransaction(t => {
return t.get(docRef).then(doc => {
const newValue = doc.data().Funds + result=handleRequest()
.then(data => {
console.log(data);
result = parseFloat(data);
update(); //the update function
return true;
})
.catch(error => {
console.log(error);
});
t.update(docRef, { Funds: newValue });
return true;
});
})
.then(success => {
console.log("successfully updated");
})
.catch(error => {
console.log(error);
});
}
这只是将一个Promise对象放入我的数据库Firestore中。
handlerequest
函数是对Paypal的调用,用于处理orderID以获取订单的值(效果很好)。完成此操作后,它将记录返回的数据。返回的数据是我要作为事务保存到Firestore的数据
我应该如何构造该代码以正确保存到Firestore
答案 0 :(得分:2)
程序通常从代码的顶部到底部顺序执行,但不进行异步处理。
最近,它已成为一个有用的世界,可以通过如下编写顺序(以类似形式)执行异步处理。
关于update
函数的声明:
async function update() {
调用具有update
签名的await
函数:
await update()
不要忘记在您的主要功能中添加async
签名,例如:
functions.https.onRequest(async (request, response) => {
您可以使用functions.firestore.document(something).onCreate(async (snap, context))
代替http.onRequest
。
而且我认为handleRequest()
也是异步的,您也需要向async
添加handleRequest()
签名。然后使用await
进行调用,如下所示:
const data = await handleRequest();
const result = parseFloat(data);
await update(result);
return true;