GMod lua http.fetch返回

时间:2014-04-21 09:25:25

标签: http lua add-on

我在这里遇到一个很难的问题: 我知道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是零

谢谢

1 个答案:

答案 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请求也没有什么不同。