此代码在 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
方法被过早调用。
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..
}