在调用闭包之前如何制作Lua功能块

迈克·乔尼斯奎

我有一个自定义的Lua解释器可执行文件,内置了一些基本的套接字功能。它不是Luasocket,而且由于我想在这里使用Luasocket而已,但我做不到(所以请不要提出它作为答案)。

我正在使用的套接字API依赖于异步闭包来表示网络操作已完成。因此,在下面的代码中,socketConnect()立即返回,然后onConnect()在连接完成时稍后调用。

local function onConnect(cookie, err, sock)
  print("Connected!")
end

local function connect(host, port)
  local success, err = socketConnect(host, port, onConnect)
  print("Connecting...")
end

所以,这是问题。我想使connect()功能块直到onConnect()调用闭包。我在Lua刚很新,但是我希望协程在这里可能会有所帮助?

编辑:这是我尝试使用协程制作功能块的尝试:

local connected = false
local function onConnect(cookie, err, sock)
  print("Connected!")
  connected = true
end

local coroConnect = coroutine.create(
  function()
    local success, err = socketConnect(m_sHost, m_nPort, onConnect);
    while not connected do
      coroutine.yield()
    end
  end
)

local function connect(sHost, nPort)
  m_sHost = sHost
  m_nPort = nPort
  while not coroutine.status(coroConnect) ~= "dead" do
    coroutine.resume(coroConnect)
    print("Connecting...")
  end
end
保罗·库尔琴科(Paul Kulchenko)

如果您想使用协程,可以使用以下方法(或让您知道如何尝试):

-- this should really be a socket property, but good enough for this example
local connected
local function onConnect(cookie, err, sock)
  print("Connected!")
  connected = true
end

local function connect(host, port)
  connected = false
  local success, err = socketConnect(host, port, onConnect)
  while not connected do
    coroutine.yield()
  end
  print("Connecting...")
end

如果现在从connect函数创建协程并继续调用该协程coroutine.resume直到完成(coroutine.status该协程将返回“死”),您将获得所需的结果。显然,您可以将该while循环移入socketConnect函数本身,这将使它从用户角度是同步的,因为onConnect在执行之前它不会返回任何内容

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

我如何停止lua功能块/调用中执行

来自分类Dev

如何执行功能块?

来自分类Dev

调用命令功能块

来自分类Dev

如何为Matlab功能块创建多个输入?

来自分类Dev

如何在CODESYS中参数化功能块?

来自分类Dev

高阶“运行”功能块在Kotlin中如何工作?

来自分类Dev

如何在Simulink Matlab功能块中使用符号

来自分类Dev

MIT Scratch功能块

来自分类Dev

如何在闭包中制作原型?

来自分类Dev

有没有办法调用在foreach功能块中声明的变量?

来自分类Dev

从目标C调用Swift,闭包到块?

来自分类Dev

C#中的内联功能块

来自分类Dev

C中的封闭/功能块

来自分类Dev

结构作为Matlab功能块的输入

来自分类Dev

C中的封闭/功能块

来自分类Dev

NodeRed功能块中的数学

来自分类Dev

如何在方法中调用闭包

来自分类Dev

如何调用传递给函数的闭包?

来自分类Dev

如何从闭包调用javascript类函数

来自分类Dev

如何覆盖javascript闭包函数调用

来自分类Dev

如何调用函数而不是实现闭包

来自分类Dev

如何覆盖javascript闭包函数调用

来自分类Dev

如何调用Swift闭包回调

来自分类Dev

从功能块列表页面删除Drupal系统功能块

来自分类Dev

TwinCat如何参考全局变量初始化功能块

来自分类Dev

如何使用find_system()区分子系统和MATLAB功能块

来自分类Dev

向量作为输入如何在 Simulink 的解释型 matlab 功能块中工作?

来自分类Dev

如何在 QML javascript 功能块内创建 C++ QObject?

来自分类常见问题

如何创建闭包调用带有较少参数的闭包迅速