pcall a GetUserIdFromNameAsync()

时间:2016-05-18 19:58:37

标签: lua roblox

好的,所以我正在制作一个关注朋友的GUI,我试图从一个带有名字的字符串中使用GetUserIdFromNameAsync。我试图pcall所以我不会得到错误但它返回零,即使它的名字,我知道有效,因为我经常在上面呼吁它。并且它返回打印中的id但是当我尝试pcall然后使用if如果它每次都返回nil并转到我的else语句。

local TeleportService = game:GetService("TeleportService")

script.Parent.OnServerEvent:connect(function(player, id)
    place = player.GuiFolder
    print(game.Players:GetUserIdFromNameAsync(id))
    --ISSUE IN LINE BELOW-- ISSUE IS IN THE LINE BELOW
    friend, msg = pcall(game.Players:GetUserIdFromNameAsync(id))
    if friend then
    print(player.Name, player, player.PlayerGui.MainMenu.Name)
    if player:IsFriendsWith(friend) then
        place.IsFriend.Value = true
        local success, errorMsg, placeId, instanceId = TeleportService:GetPlayerPlaceInstanceAsync(friend)
            if success then
                place.foundplayerbar.Value = "Found player. Would you like to join?"
                place.Activated.Value = true
            else enter code here
                place.errorbar.Value = "ERROR: Player not online!"
            end
        else place.errorbar.Value = "ERROR: Not Friends with person!"
    end
    else place.errorbar.Value = "ERROR: Player doesn't exist!"
    end
end)

2 个答案:

答案 0 :(得分:1)

根据“Lua编程”电子书:“假设您想运行一段Lua代码并捕获运行该代码时引发的任何错误。您的第一步是将该段代码封装在一个函数中。 .pall函数在保护模式下调用它的第一个参数,以便在函数运行时捕获任何错误。如果没有错误,pcall返回true,加上调用返回的任何值。否则,它返回false,加上错误消息。“

不是直接在函数上调用pcall,而是首先将所有内容封装在函数中:

function func()
    friend, msg = game.Players:GetUserIdFromNameAsync(id)
    if friend then
        ...
    else
        ...
    end
 end

然后你可以用pcall调用函数并捕获任何错误:

local status, err = pcall(func)
if not status then print(err) end

答案 1 :(得分:0)

来自Lua文档:

  

假设您想运行一段Lua代码并捕获任何错误   在运行该代码时引发。你的第一步是封装它   函数中的一段代码;让我们称之为foo ...然后,你用pcall调用foo ......

您的代码使用带有函数的pcall,但它调用函数而不是将其用作参数。

要解决此问题,您可以将game.Players:GetUserIdFromNameAsync(id)放在函数中并将其用作参数,但更简单的方法是使用匿名函数,例如

 friend, msg = pcall(function() 
     game.Players:GetUserIdFromNameAsync(id) 
 end)

将为您提供正确的价值。