Unity 协程无法按预期与 WebRequest 一起工作

问题描述 投票:0回答:1

此代码在 Web 请求之后立即记录

token
,此时它应该等待设置变量。这是代码:

public void ConnectToLiveKit(string Username, string RoomName){

        string query = $"?roomname={RoomName}&username={Username}";
        string fullUri = ServiceURL+query;
        StartCoroutine(GetToken(fullUri));
        Debug.Log($"Token: {m_Token}");
        // handle NO TOKEN here
        StartCoroutine(CreateOrJoinRoom(Username, RoomName));
    }

    IEnumerator GetToken(string uri)
    {
        Debug.Log("Getting Token at " + uri + " ...");
        // using (UnityWebRequest webRequest = UnityWebRequest.Get(uri))
        // {
            UnityWebRequest webRequest = UnityWebRequest.Get(uri);
            // Request and wait for the desired page.
            yield return webRequest.SendWebRequest();
            // while (!webRequest.result.Equals(UnityWebRequest.Result.Success)){
            //     yield return new WaitForEndOfFrame();
            // }

            string[] pages = uri.Split('/');
            int page = pages.Length - 1;

            switch (webRequest.result)
            {
                case UnityWebRequest.Result.ConnectionError:
                case UnityWebRequest.Result.DataProcessingError:
                    Debug.LogError(pages[page] + ": Error: " + webRequest.error);
                    break;
                case UnityWebRequest.Result.ProtocolError:
                    Debug.LogError(pages[page] + ": HTTP Error: " + webRequest.error);
                    break;
                case UnityWebRequest.Result.Success:
                    Debug.Log(pages[page] + ":\nReceived: " + webRequest.downloadHandler.text);
                    m_Token = webRequest.downloadHandler.text;
                    break;
            }
            yield break;
        // }
    }

GetToken
协程应等待
UnityWebRequest
结束并设置令牌变量,然后再转到下一行并记录变量的值。它不会......它立即发生,然后不久之后我就收到了使用令牌记录的网络请求的响应。
CreateOrJoinRoom
方法被过早调用。

c# unity-game-engine unityscript unity-webgl
1个回答
0
投票

StartCoroutine
不会阻塞代码,因此
ConnectToLiveKit
中的行正在按正常顺序和时间执行。

您可以通过将例程链接在一起来解决这个问题,如下所示:

public void ConnectToLiveKit(string Username, string RoomName)
{
    string query = $"?roomname={RoomName}&username={Username}";
    string fullUri = ServiceURL + query;

    StartCoroutine(ConnectRoutine(fullUri, Username, RoomName));
}
private IEnumerator ConnectRoutine(string uri, string username, string roomName)
{
    yield return FetchTokenRoutine(uri);

    Debug.Log($"Token: {m_token}");

    // Handle no token here..

    yield return CreateOrJoinRoom(username, roomName);
}
private IEnumerator FetchTokenRoutine(string uri)
{
    // Actual code here..
}
private IEnumerator CreateOrJoinRoom(string user, string roomName)
{
    // Actual code here..
}
© www.soinside.com 2019 - 2024. All rights reserved.