Lua 中如何实现条件循环和随机选择

我想获取一个随机的记录(使用两个 API),其中包含一张图片并将其显示给用户。此外,由于获取的记录包含不同的值,我希望稍后在不同的 Lua 文件中重复使用它们。

在下面的代码中,value.original.source 是图像网址(在第二个 API 调用中),并且在记录中可能为空(nil),因此我认为我需要保持获取记录,同时它为空(使用 repeat-untilwhile-do?)也许我需要使用全局变量将数据传递到不同的文件中,但不确定。它很棘手,具有挑战性。任何关于某个或全部内容的想法和解决方案都将不胜感激。谢谢!

-- 创建空表
t = {}
t2 = {}

-- 第一个 API 调用
local json = require("json")
local function getWikipediaData(event)
    local res = json.prettify(event.response)
    local decoded = json.decode(res)
    for key, value in pairs(decoded.results.bindings) do
        local pname = value.person_name.value
        local dbpuri = value.person.value
        -- 将数据放入表中
        t["PNAME"] = pname
        t["DBPURI"] = dbpuri
        -- 打印键值
        for key, value in pairs(t) do
            print(key, value)
        end
        local wikititle = string.gsub(dbpuri, "http://dbpedia.org/resource/", "")
        print(wikititle)

        -- 2nd API call,其中一个函数嵌套了进去
        network.request(
        "https://en.wikipedia.org/w/api.php?action=query&prop=pageimages&format=json&piprop=original&titles=" .. wikititle, "GET",
        function(event)
            local res2 = json.prettify(event.response)
            local decoded2 = json.decode(res2)
            -- 这部分是我有问题的棘手部分。"value.original.source" 在记录中可能为空(nil),因此我想保持获取记录,同时它为空。然后,在获取的记录中(其中包含 `value.original.source`),最后我想随机选择一个记录。记录中的数据(在变量中)应该传递给其他文件。
            while (pickdata == nil) do
                -- 下一级到“pages”是数组,因此需要使用 for 重复获取数据
                for key, value in pairs(decoded2.query.pages) do
                    -- 将数据放入表中
                    local source = value.original.source
                    table.insert(t2, source)
                end
            end
        end, params)
    end
end

-- 这是第二个任务,尝试随机从创建的表中选择一个带有图像的记录,但不起作用。循环和本地与全局变量是要解决的问题。
local pick = math.random(3)
local pickdata = t2[pick]
print(pickdata)

local headers = {}
headers["Content-Type"] = "application/json"
local body = ""
local params = {}
params.headers = headers
params.body = body
network.request("https://dbpedia.org/sparql?default-graph-uri=http%3A%2F%2Fdbpedia.org&query=select+*%0D%0Awhere+{%3Fperson+rdfs%3Alabel+%3Fperson_name+%3B+rdf%3Atype+%3Ftype+%3B+dbo%3AbirthDate+%3Fbirthdate+.%0D%0A++++bind(rand(1+%2B+strlen(str(%3Fperson))*0)+as+%3Frid)%0D%0AFILTER+regex(%3Ftype%2C+%22Person%22)%0D%0A}+order+by+%3Frid%0D%0ALIMIT+10&format=text%2Fhtml&CXML_redir_for_subjs=121&CXML_redir_for_hrefs=&timeout=30000&debug=on&format=json", "GET", networkListener, params)
点赞