gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 01:36:57 26 4
gpt4 key购买 nike

我正在将 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com