如何使用Edge.js模块创build和重用实例variables?

我的问题是什么?

当我说“闪烁绿色”的无人机将做我想要的。 这很好。

当我再次说“闪烁绿色”时,它会执行代码,但是无人机不会给出响应。 无人机第一次只给出了答复。 所以每次我必须重新启动程序才能工作。 恼人的…

第二次发生了什么?

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

代码如下:

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(); 

我被允许创build一个客户端,我猜。 我必须创build和重用客户端实例,所以我可以使用同一个客户端来解决问题。 但我不知道如何做Edge.js模块…

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

谢谢,

杰米

@Jay>

我有点进一步,让我们看看我做了什么。

  1. 我创build了一个布尔值来检查是否有一个客户端和一个variables来保存客户端。

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

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

     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. 和function方法做一个动作(无人机的animation),应该使用相同的客户端

     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]]` 

所以我的下一个问题是,我怎样才能使用客户端对象的function?

var client = GetOrCreateClient();

variables应该放入:

  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,但我可以看到你的问题从您的发布的例子。

为什么不把Edgefunction分解成类的单独function?

例如,定义创build客户端并返回的边缘function,如果客户端已经创build,则返回现有的客户端。 调用这个函数Ge​​tOrCreateClient。

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

最后解释语音命令,并根据需要使用GetOrCreateClient函数为无人机的相应客户端分派客户端以获得正确的无人机。

我可以写一些代码来帮助你,但是我希望看到你是如何从我之前解释的,而不是仅仅为你写的。

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

UPDATE

要在函数调用之间共享数据,我认为你需要导出你想要共享的variables或函数。

可能有一个导出函数或一个窗口或GLOBAL对象,可以用你需要导出的variables进行扩充。

就目前的方法而言,您已经看到想要在C#中定义逻辑,因为逻辑是在JavaScript中发生的,所以您实际上可以在edge.js函数中定义GetOrCreateClient,就像您在C#中使用JavaScript一样。

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

这可以在处理对blinkGreen的呼叫之前进行定义。

然后在javascript中创buildclient = GetOrCreateClient,第一次创build客户端,第二次将返回现有的客户端。

然后根据需要拨打blinkGreen电话。

最后,C#已经有了一个Ardone库,除非你需要Node,否则Node对于这个方程来说是非常有意义的,并且只用c#就可以了。

我不熟悉这个库,但大多数NodeJS需要caching,所以只有函数内的部分将运行多次。 尝试在返回的函数中移动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); } "); }