node.js - 在 HttpsCallableResult 完成之前等待所有回调返回

标签 node.js firebase unity-game-engine google-cloud-functions

我正在将 Firebase 函数与 Unity 结合使用。主函数在数据库函数完成之前返回。我对 Node.js 还很陌生,并且仍在尝试了解所有异步回调的内容。

我尝试过 CallAsync、ContinueWith 和 Coroutines,但函数总是在第一次返回后继续(我使用 Task.isCompleted() 来检查)。

我的 Node.js 函数是这样的:

exports.my_fn = functions.https.onCall((data, context) => {
    dbsessions.child(id).once("value").then(function(snapshot) {
      if (snapshot.val()) {
        Create();
      } else {
        Move(session);
      }});
  });

function Move(session) {
  if (session["error"]) {
    return return_stuff;
  } else {
      if (some_condition) {
        dbsessions.child(id).set(sson, function(set_error) {
          if (set_error) {
            return return_stuff;
          } else {
            return return_stuff;
          }
      });
      } else {
      dbaimoves.child(stt).child(dif).once("value").then(function(snapshot) {
        if (snapshot.val()) {
          return return_stuff;
        } else {
          if (!first) {
            dbsessions.child(id).set(sson, function(set_error) {
                if (set_error) {
                  return return_stuff;
                } else {
                  return return_stuff;
                }
            });
        } else {
          return return_stuff;
        }
      }
      }, function(errorObject) {
        if (errorObject) {
          return return_stuff;
        }
      });
}}}

var Create = function(data, callback) {
    dbdifficulty.child(data).once("value").then(function(snapshot) {
      if (snapshot.val()) {
        return callback();
      } else {
        dbsessions.child(data.id).set(data, function(set_error) {
          if (set_error) {
            return callback();
          } else {
            return callback();
          }});
    }});
}

(我跳过了不必要的数据以使问题简单)。基本上就是嵌套返回和数据库操作,回调和函数相互调用。

我的 C# Unity 代码是这样的:

private async Task<string> AddMessageAsync(string text)
    {
        // Create the arguments of the callable function.
        var data = new Dictionary<string, string>();
        data["s"] = text;
        data["d"] = "0";

        var function = func.GetHttpsCallable("my_fn");
        var Tfn = function.CallAsync(data);
        var TRes = await Tfn;

        if (Tfn.IsCompleted)
        {
            JFunc result = JsonUtility.FromJson<JFunc>(TRes.Data.ToString());
            Debug.Log("error:" + result.error);
            return result.move;
        }
        return "error";
    }

上面的代码类似于我的实际代码,它从 Unity 调用该函数,该函数在 Firebase 上运行并很快返回(在进入 Create() 或 Move() 之前),Unity 接收结果 (null)。几秒钟后,该函数在 Firebase 上成功完成,但 Unity 没有收到任何相关信息(或者可能收到了,但我无法正确处理)。

我需要知道:

  1. 如何使主函数返回其他函数返回的内容,以及

  2. 如何让 C# 等待并持续监听返回值,而不是在第一次返回后就认为任务已经完成。如果我只能在结果准备好时才返回,那就更好了。

最佳答案

要使 Cloud Functions 代码返回值,请确保每个函数返回一个值或一个 Promise。 promise “冒泡”意味着只要您在每个级别都有return,您从最嵌套的代码返回的值就会返回到顶层。

因此,在快速扫描的代码中,您需要:

exports.my_fn = functions.https.onCall((data, context) => {
    return dbsessions.child(id).once("value").then(function(snapshot) {
      if (snapshot.val()) {
        return Create();
      } else {
        return Move(session);
      }});
  });

var Create = function(data, callback) {
    return dbdifficulty.child(data).once("value").then(function(snapshot) {
      if (snapshot.val()) {
        return callback();
      } else {
        return dbsessions.child(data.id).set(data, function(set_error) {
          if (set_error) {
            return callback();
          } else {
            return callback();
          }});
    }});
}

我在这里仅检测了顶级 my_fnCreate,以展示要做什么。您必须自己对 Move 执行相同的操作。

关于node.js - 在 HttpsCallableResult 完成之前等待所有回调返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54235447/

相关文章:

javascript - MongoDB 使用 node-mongodb-native 排序

javascript - Express js 将应用程序变量发送到路由

javascript - 如何将 Node.js 变量放入我的 &lt;script&gt;&lt;/script&gt; 中?

java - 如何获取 Firebase 的内部子值?

c# - 我可以在 Hololens 中录制也使用相机的应用程序的视频吗?有没有办法两全其美?

unity-game-engine - 两个物体之间的夹持

node.js - 使用 mongoose 更新 slug .pre ('save' )

node.js - 无法在 Windows 中为 Node 设置 process.env.PORT 变量

Firebase init 函数返回 403 调用者没有权限

unity-game-engine - 将 RigidBody2D 旋转与 Sprite 分开