Lua.vm.js ajax calls callbacks but data is not returned

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):

 <!-- begin script tag example --> <script src="lua.vm.js"></script> <script src="jquery-1.10.1.js"></script> <!-- Simplest web server for serving static files python -m SimpleHTTPServer 8080 --> <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> <!-- end script tag example --> <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" } } } } } 
+6
source share
1 answer

Sorry, I just realized that I forgot to return and report the decision.

As with jQuery 1.5, all jQuery Ajax methods return a superset of the XMLHTTPRequest object. This jQuery XHR or "jqXHR" object returned by $ .get () implements the Promise interface, providing it with all the properties, methods and ...

For example, it contains the responseText and responseXML properties, as well as the getResponseHeader () method.

Based on this, the following code works and returns callback data (responseText):

 local jq = js.get("$") local jqxhr = jq.get("/glossary.json") jqxhr.done(function() print(jqxhr.responseText) end) 

You can also get around jQuery in general using the direct XMLHTTPRequest shell:

 local xhr = function(method, url, callback) local xhr = js.new.XMLHttpRequest() xhr.onreadystatechange = function() if xhr.readyState == 4 and xhr.status == 200 then return callback(xhr.responseText) end end xhr.open(method, url) xhr.send() end xhr("GET", "/glossary.json", function(data) print(data) end) 
+2
source

Source: https://habr.com/ru/post/948339/


All Articles