2013-06-28 38 views
6

Đó là vấn đề tôi nêu tại số https://github.com/kripken/lua.vm.js/issues/5 mà tôi muốn gửi tới stackoverflow. Tôi có thể nhận được câu trả lời nhanh hơn ở đây vì mức độ phơi sáng cao hơn. Chỉ để đảm bảo câu hỏi của tôi được hiểu rõ ràng, tôi sẽ giải quyết nó. Làm cách nào để tôi có thể tiếp cận dữ liệu gọi lại từ các ví dụ bên dưới?gọi lại ajax lua.vm.js nhưng dữ liệu không được trả lại

Vấn đề nộp:

(lua.vm.js là a) mảnh tuyệt vời của phần mềm với một tiềm năng rất lớn để thay thế JavaScript trong trình duyệt!

Một vài đoạn mã được thu thập từ danh sách gửi thư, wiki, sự cố, v.v. Mọi thứ hoạt động ra khỏi hộp mà không có tác động hiệu suất được cảm nhận. Tôi chỉ gặp vấn đề với các giá trị trả về gọi lại trên các cuộc gọi jquery ajax và WebSocket trả về tin nhắn.

Ví dụ (xem script_example.html dưới đây):

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 

Một cách giải quyết bằng cách sử dụng tải() chức năng:

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 

Sau đây đi vào script_example.html (xem 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> 

Tệp glossary.json được tải trong ví dụ trên:

{ 
    "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" 
      } 
     } 
    } 
    } 
} 

Trả lời

2

Xin lỗi, tôi vừa nhận ra rằng tôi đã quên quay lại và báo cáo giải pháp.

Kể từ jQuery 1.5, tất cả các phương thức Ajax của jQuery trả về một siêu của đối tượng XMLHTTPRequest. Đối tượng jQuery XHR này, hoặc "jqXHR", được trả về bởi $ .get() thực hiện giao diện Promise, cho nó tất cả các thuộc tính, phương thức, ...

Ví dụ, nó chứa các thuộc tính responseText và responseXML, cũng như phương thức getResponseHeader().

Trên cơ sở này, các mã sau đây làm việc và trả về dữ liệu callback (responseText):

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

Người ta cũng có thể bỏ qua jQuery hoàn toàn với một chức năng XMLHttpRequest wrapper trực tiếp:

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) 
Các vấn đề liên quan