如何使用 Edge.js 模块创建和重用实例变量

本文关键字:实例 变量 创建 何使用 Edge js 模块 | 更新日期: 2023-09-27 18:34:22

我的问题是什么?

当我说"闪烁绿色"时,无人机会完全按照我的意愿去做。这很好用。

当我再次说"闪烁绿色"时,它会执行代码,但无人机没有给出响应。无人机在第一次只给出回应。因此,每次我都必须重新启动程序才能使其工作。烦人。。。

第二次会发生什么?

它将做完全相同的事情,它也在执行代码,但无人机不会给出响应。

代码如下:

private static void _speechRecognitionEngine_SpeechRecognized(object sender, SpeechRecognizedEventArgs e)
{
    switch (e.Result.Text)
    {
        case "Blink green":
            Task.Run((Action)blinkGreen);
            break;
    }
}
// ONLY WORKS THE FIRST TIME
// WHEN I SAY "BLINK GREEN" AGAIN, IT'S WILL EXECUTE THE 
// CODE BUT THE DRONE DOESN'T GIVE A RESPONSE. ONLY THE 
// FIRST TIME (SO I HAVE TO RESTART THE PROGRAM)
public static async void blinkGreen()
{
    var func = Edge.Func(@"
        var arDrone = require('ar-drone');
        var client = arDrone.createClient(); 
        return function(data, callback){
            client.animateLeds('blinkGreen',5,2);
            callback(null, data);
        }
    ");
    Console.WriteLine(await func("BLINK EXECUTED!"));
}

我认为发生了什么事:

var arDrone = require('ar-drone');
var client = arDrone.createClient(); 

我猜我可以创建一个客户端。我必须创建和重用客户端实例,以便我可以使用可以解决问题的同一客户端。但是我不知道如何使用 Edge.js 模块做到这一点......

我希望有人可以帮助我解决这个问题。

谢谢

杰米

如何使用 Edge.js 模块创建和重用实例变量

@Jay>

更远一点,让我们看看我做了什么。

  1. 我创建了一个布尔值来检查是否已经有一个客户端和一个变量来保存客户端。

    static bool clientCreated = false;
    static object currentClient;
    
  2. 在程序开始时,我创建了一个检查来获取现有或新客户

        // First check to get an existing or new client
        currentClient = GetOrCreateClient();
    
  3. 我创建了一个返回现有或新客户端的方法

    public static object GetOrCreateClient()
    {
        // If there is already a client
        if (clientCreated)
        {
            Console.WriteLine("There's already a client!");
        }
        // If there is no client
        else
        {
            // Set boolean
            clientCreated = true;
            // Create a client
            var newClient = Edge.Func(@"
                var arDrone = require('ar-drone');
                var client = arDrone.createClient();
                return function(data, callback){
                    callback(null, data);
                }
            ");
            Console.WriteLine("Client created!");
            // Return new client
            return newClient;
        }
        // Return current client
        return currentClient;
    }
    
  4. 以及执行应使用同一客户端的动作(无人机动画(的功能方法

    public static async void blinkGreen()
    {
        // Get an existing or new client
        var client = GetOrCreateClient();
        // Execute the functionality
        var func = Edge.Func(@"             
            var arDrone = require('ar-drone'); // ACTUALLY THIS ONE IS ALREADY DEFINED IN THE METHOD GetOrCreateClient()
            var client = I WANT HERE THE CLIENT, BUT HOW?
            return function(data, callback){
                client.animateLeds('blinkGreen',5,2);
                callback(null, data);
            }
        ");
        Console.WriteLine(await func("BLINK EXECUTED!"));
    }
    

现在我被困在几件事上,因为这是在对象中全局保存客户端的正确方法吗?因为该方法GetOrCreateClient()返回以下对象:

`System.Func`2[System.Object,System.Threading.Tasks.Task`1[System.Object]]`

所以我的下一个问题是,如何将客户端对象用于功能?

var client = GetOrCreateClient();

变量应放入:

        var func = Edge.Func(@"             
            var arDrone = require('ar-drone'); // ACTUALLY THIS ONE IS ALREADY DEFINED IN THE METHOD GetOrCreateClient()
            var client = I WANT HERE THE CLIENT, BUT HOW?

断开客户端连接的另一种方法也可以解决问题,但确实会花费更多的开销和延迟。

老实说我没有使用过 Edge.js但我可以从您发布的示例中看到您的问题。

为什么不将 Edge 功能分解为类上的单独函数。

例如,定义用于创建客户端并返回它的边缘功能,如果客户端已经创建,则返回现有客户端。将此函数称为 GetOrCreateClient。

然后定义需要客户端获取客户端对象的调用,以便如果您有多个客户端用于多个无人机,则可以分别使每个客户端闪烁。

最后,使用

GetOrCreateClient 函数解释语音命令并根据需要将语音命令调度到无人机的相应客户端,以获取正确无人机的客户端。

我可以编写一些代码来帮助您解决此问题,但我想从我首先解释的内容中看看您如何到达那里,而不仅仅是为您编写。

另一种方法是在收到响应后断开客户端的连接,但这在发出命令时会花费更多的开销和延迟。

更新

要在函数调用之间共享数据,我认为您需要导出要共享的变量或函数。

可能有一个导出函数或窗口或 GLOBAL 对象,可以使用您需要导出的变量进行增强。

就您目前的方法而言,您似乎想要在 C# 中定义逻辑,因为逻辑发生在 Javascript 中,您实际上可以在 edge.js 函数中定义 GetOrCreateClient,就像您在 C# 中一样,但在 Javascript 中。

'function GetOrCreateClient(({ return !this.client ? this.client=require ('ardone'( : this.client; }'

这可以在处理对 blinkGreen 的调用之前定义。

然后在javascript中使客户端= GetOrCreateClient,第一次它将创建客户端,第二次它将返回现有客户端。

然后根据需要拨打眨眼绿色的电话。

最后,C#已经有一个Ardone库,除非你需要Node,否则将Node排除在等式之外并单独使用c#对我来说是有意义的。

我不熟悉这个库,但大多数 NodeJS 需求都是缓存的,所以只有函数中的部分会运行多次。尝试在返回的函数中移动animateLeds调用,如下所示:

public static void blinkGreen()
{
    var func = Edge.Func(@"
        var arDrone = require('ar-drone');
        var client = arDrone.createClient();
        return function(data, callback){
            client.animateLeds('blinkGreen',5,2);
            callback(null, data);
        }
    ");
}