如何正确进行交易,直到另一个承诺履行打字稿

时间:2019-05-19 14:15:48

标签: typescript google-cloud-functions

我有这段代码,我需要第二个功能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

1 个答案:

答案 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;