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

标签 c# node.js speech-recognition voice-recognition

我的问题是什么?

当我说“闪烁绿色”时,无人机将完全按照我的要求进行操作。效果很好。

当我再次说“Blink green”时,它会执行代码,但无人机没有给出响应。无人机只在第一时间给出了回应。所以每次我都必须重新启动程序才能使其工作。烦人的...

第二次会发生什么?

它会做同样的事情,它也在执行代码,但无人机没有给出响应。

代码如下:

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 模块来做到这一点...

我希望有人能帮我解决这个问题。

谢谢,

杰米

最佳答案

@杰伊>

我走得更远了,让我们看看我做了什么。

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

    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. 以及执行 Action (无人机动画)的功能方法应该使用相同的客户端

    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?

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

关于c# - 如何使用 Edge.js 模块创建和重用实例变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35373241/

相关文章:

c# - 如何在不自动降级到同步模式的情况下调用异步方法?

c# - asp.net 4 中的潜在危险请求

python - 如何在 VS 代码的 node.js 应用程序中使用 python 包时导入它

javascript - Socket.IO 客户端 .js 文件位于何处?

c++ - tensorflow :转置需要一个大小为 1 的 vector 。但输入(1)是一个大小为 2 的 vector

algorithm - 如何使用python查找两个语音文件的差异

c# - 使用的sql server版本不支持数据类型 'datetime2'

c# - 无法在 splitcontainer 中处理控件

javascript - Dart Nodejs 和 Socketio

c# - Microsoft Speech SDK 11 中的语法过多