This is the problem that I raised in https://github.com/kripken/lua.vm.js/issues/5 , which I would like to send to stackoverflow. I can get a quicker answer here, given the higher exposure. To make sure that my question is clearly understood, I will repeat it. How can I get callback data from the examples below?
Submitted issue:
(lua.vm.js is) a fantastic piece of software with huge potential for replacing JavaScript in a browser!
A few snippets of code compiled from a mailing list, wiki, issues, etc. Everything works in a box without a tangible impact on performance. I only have problems with return callback values ββon jQuery ajax calls and the returned WebSocket message.
For example (see script_example.html below):
js.run('$.get("/glossary.json", function(data) { console.log(data); });') -- this works jq.get("/glossary.json", function(data) print(data) end) -- the callback is firing, but data is not returned
Workaround using the load () function:
jq('#result').hide().load("/glossary.json", function() print(jq('#result').html()) end) -- this works because after the callback is fired, we just collect the result from the result div
The following is the script script_example.html (see the lua.vm.js git repository):
<script src="lua.vm.js"></script> <script src="jquery-1.10.1.js"></script> <script type="text/lua"> -- Print contents of `tbl`, with indentation. -- `indent` sets the initial level of indentation. function tprint (tbl, indent) if not indent then indent = 0 end for k, v in pairs(tbl) do formatting = string.rep(" ", indent) .. k .. ": " if type(v) == "table" then print(formatting) tprint(v, indent+1) else print(formatting .. tostring(v)) end end end -- function test() -- return 'ok' -- end -- for i=1,5 do -- js.global.alert(test()) -- end local jq = js.get("$") -- jq('body').append("plop").click(function() js.global.alert("plop click") end) -- local version = jq().jquery -- js.global.alert(version) -- jq('#result').load("/glossary.json") jq('#result').hide().load("/glossary.json", function() print(jq('#result').html()) end) -- jq.get("/glossary.json", function(data) print(data) end) -- callback is firing, but data is not returned -- js.run('$.get("/glossary.json", function(data) { console.log(data); });') -- local ws = js.new.WebSocket("ws://echo.websocket.org/?encoding=text") -- ws.onopen = function() -- print("connected!") -- ws.send("Rock it with HTML5 WebSocket") -- end -- ws.onclose = function() -- print("disconnected") -- end -- ws.onerror = function(error) -- print(error) -- end -- ws.onmessage = function(e) -- tprint(e) -- using tprint() because an empty table is returned instead of the message -- ws.close() -- end </script> <div id="result"></div>
The glossary.json file loaded in the examples above:
{ "glossary": { "title": "example glossary", "GlossDiv": { "title": "S", "GlossList": { "GlossEntry": { "ID": "SGML", "SortAs": "SGML", "GlossTerm": "Standard Generalized Markup Language", "Acronym": "SGML", "Abbrev": "ISO 8879:1986", "GlossDef": { "para": "A meta-markup language, used to create markup languages such as DocBook.", "GlossSeeAlso": ["GML", "XML"] }, "GlossSee": "markup" } } } } }