我在这里遇到一个很难的问题: 我知道http.fetch(url,onsuccess,onfailure)命令。现在我想把这个命令放在一个返回的函数中。
function cl_PPlay.getSoundCloudInfo( rawURL )
local entry
http.Fetch( "http://api.soundcloud.com/resolve.json?url="..rawURL.."&client_id=92373aa73cab62ccf53121163bb1246e",
function( body, len, headers, code )
entry = util.JSONToTable( body )
if !entry.streamable then
cl_PPlay.showNotify( "SoundCloud URL not streamable", "error", 10)
end
end,
function( error )
print("ERROR with fetching!")
end
);
return entry
end
所以这段代码看起来很好,但是当我调用cl_PPlay.getSoundCloudInfo(SOMEURL)时,它打印nil,因为http.Fetch函数需要一些时间来获取正文等等。
如何解决问题,以便获得“entry”变量?
修改
这是代码,我在其中调用cl_PPlay.getSoundCloudInfo(rawURL)
local e1 = cl_PPlay.getSoundCloudInfo(te_url:GetValue())
PrintTable(e1)
它会在
行引发错误PrintTable(e1)
因为e1是零
谢谢
答案 0 :(得分:2)
修复问题的最简单方法可能是更新你的函数以获取一个url和一个回调,它可以在请求成功完成后调用。像这样的东西:
function postProcess(entry)
-- do something with entry
end
function cl_PPlay.getSoundCloudInfo(rawURL, cb)
local entry
local url = "http://api.soundcloud.com/resolve.json?url="..rawURL.."&client_id=92373aa73cab62ccf53121163bb1246e"
http.Fetch(url,
function(body, len, headers, code)
entry = util.JSONToTable(body)
if !entry.streamable then
cl_PPlay.showNotify( "SoundCloud URL not streamable", "error", 10)
return
end
-- here we know entry is good, so invoke our post process function and
-- give it the data we've fetched
cb(entry);
end,
function( error )
print("ERROR with fetching!")
end
);
end
然后,您可以执行以下操作:
cl_PPlay.getSoundCloudInfo('asdfasdf', postProcess)
或
cl_PPlay.getSoundCloudInfo('asdasdf', function(entry)
-- code to do stuff with entry
end)
这是一个非常常见的javascript习惯用法,因为你在js中做的大部分都是基于事件的,http请求也没有什么不同。