Add late installed listeners
Signed-off-by: Rahix <rahix@rahix.de>
This commit is contained in:
parent
c33fdd41a6
commit
50ae923ef7
3 changed files with 31 additions and 2 deletions
|
|
@ -172,8 +172,10 @@ the node will come online later. `query` must be a valid query, chosen from
|
||||||
`BaseControl.Query`. A full list of currently supported queries was shown above.
|
`BaseControl.Query`. A full list of currently supported queries was shown above.
|
||||||
The `callback` function will get one argument: The new value of the noun that
|
The `callback` function will get one argument: The new value of the noun that
|
||||||
triggered the event. `listen` returns a unique id for the installed listener
|
triggered the event. `listen` returns a unique id for the installed listener
|
||||||
that could later be used to cancel it.
|
that could later be used to cancel it. `listen` also returns a boolean as the
|
||||||
|
second value: It indicates whether an attempt was made at installing the
|
||||||
|
listener. If the noun was not yet known (`false`), the listener is still kept
|
||||||
|
and will be installed as soon as the noun is registered.
|
||||||
```lua
|
```lua
|
||||||
bc = require("bc"):finalize{"some_noun"}
|
bc = require("bc"):finalize{"some_noun"}
|
||||||
bc:listen("some_noun", bc.Query.Change, function(value)
|
bc:listen("some_noun", bc.Query.Change, function(value)
|
||||||
|
|
|
||||||
8
bc.lua
8
bc.lua
|
|
@ -433,6 +433,14 @@ function BaseControl:_network_handler(remote, msg)
|
||||||
elseif msg.ty == Message.Register then
|
elseif msg.ty == Message.Register then
|
||||||
for _, noun in ipairs(msg.nouns or {}) do
|
for _, noun in ipairs(msg.nouns or {}) do
|
||||||
self.remote_nouns[noun] = remote
|
self.remote_nouns[noun] = remote
|
||||||
|
for id, l in pairs(self.listeners[noun] or {}) do
|
||||||
|
self.network:send(remote, {
|
||||||
|
ty=Message.ListenRequest,
|
||||||
|
noun=noun,
|
||||||
|
id=id,
|
||||||
|
query=l.query,
|
||||||
|
})
|
||||||
|
end
|
||||||
end
|
end
|
||||||
for _, verb in ipairs(msg.verbs or {}) do
|
for _, verb in ipairs(msg.verbs or {}) do
|
||||||
self.remote_verbs[verb] = remote
|
self.remote_verbs[verb] = remote
|
||||||
|
|
|
||||||
|
|
@ -195,3 +195,22 @@ function test_listen_cancel_remote()
|
||||||
bc1:set("lcanr1", 21)
|
bc1:set("lcanr1", 21)
|
||||||
assert_equal(1, n, "wrong number of listener invokations")
|
assert_equal(1, n, "wrong number of listener invokations")
|
||||||
end
|
end
|
||||||
|
|
||||||
|
function test_listen_late_install()
|
||||||
|
local bc1 = BaseControl:new()
|
||||||
|
local addr1 = network.get_scene()
|
||||||
|
|
||||||
|
local n = 0
|
||||||
|
bc1:listen("late1", BaseControl.Query.Change, function()
|
||||||
|
n = n + 1
|
||||||
|
end)
|
||||||
|
|
||||||
|
local bc2 = BaseControl:new()
|
||||||
|
local addr2 = network.get_scene()
|
||||||
|
bc2:register("late1", 1234)
|
||||||
|
bc2:finalize()
|
||||||
|
|
||||||
|
assert_equal(0, n, "wrong number of listener invokations")
|
||||||
|
bc2:set("late1", 34)
|
||||||
|
assert_equal(1, n, "wrong number of listener invokations")
|
||||||
|
end
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue