遍历多个 UnityWebRequests
Iterating over multiple UnityWebRequests
我一直在努力让一些 API 沟通工作。我正在使用 UnityWebRequests,因为我想构建为 WebGL(我尝试了 System.Net.WebRequest,它在游戏模式下工作,但与 WebGL 不兼容)。这可能只是协程的问题,但我会以半伪的方式向您展示我目前所拥有的以及我的问题是什么:
using UnityEngine;
using UnityEngine.Networking;
using System.Collections;
using System.Collections.Generic;
public class scking : MonoBehaviour
{
string tempText;
string getUri = "https://api.opensensors.com/getProjectMessages";
string jwtToken = "someToken";
private void Start()
{
pullAllData();
}
IEnumerator GetDataRequest(string currentDateString, string nextDateString, string sensorID)
{
string requestParam = "myparameters: " + nextDateString + sensorID; // simplified dummy parameters
using (UnityWebRequest webRequest = UnityWebRequest.Get(requestParam))
{
webRequest.SetRequestHeader("Authorization", "Bearer " + jwtToken);
webRequest.SetRequestHeader("Content-Type", "application/json");
yield return webRequest.SendWebRequest();
// from unity api example
string[] pages = getUri.Split('/');
int page = pages.Length - 1;
if (webRequest.isNetworkError)
{
Debug.Log(pages[page] + ": Error: " + webRequest.error);
}
else
{
Debug.Log(pages[page] + ":\nReceived: " + webRequest.downloadHandler.text);
}
// getting the data i pulled out of the coroutine for further manipulation
this.tempText = webRequest.downloadHandler.text;
// show whats been pulled
print(this.tempText);
}
}
void pullAllData()
{
int allDaysCount = 10;
List<int> sensorIds; // initialized with some ids
for(int i = 0; i < allDaysCount - 1; i++)
{
for(int j = 0; j < sensorIds.Count; j++)
{
StartCoroutine(GetDataRequest(i, i + 1, sensorIds[j]));
// show whats been pulled
print(this.tempText);
// parse json string this.tempText etc.
}
}
}
}
输出为(按时间排序)
来自 pullAddData:null
中的打印
然后在协程中打印下一个:jsonItem
基本上,Coroutine 花费的时间太长,而且对于我的循环来说已经太晚了,无法继续,而且因为我得到一个 null,所以我当然无法解析或操作我的数据。或者我的整个工作都有缺陷,那么,如何正确地做到这一点?
非常感谢您对此提供的任何帮助。善良的菲利普
如果你想等 parallel 查看我对 Wait for all requests to continue
的回答
如果你宁愿继续等待它们一个接一个你可以简单地将它们包装成一个更大的协程:
void pullAllData()
{
int allDaysCount = 10;
List<int> sensorIds; // initialized with some ids
// start the "parent" Coroutine
StartCoroutine(GetAllData(allDaysCount, sensorIds));
}
IEnumerator GetAllData(int allDaysCount, List<int> sensorIds)
{
for(int i = 0; i < allDaysCount - 1; i++)
{
for(int j = 0; j < sensorIds.Count; j++)
{
// Simply run and wait for this IEnumerator
// in order to execute them one at a time
yield return GetDataRequest(i, i + 1, sensorIds[j]);
// show whats been pulled
print(this.tempText);
// parse json string this.tempText etc.
}
}
// Maybe do something when all requests are finished and handled
}
IEnumerator GetDataRequest(string currentDateString, string nextDateString, string sensorID)
{
string requestParam = "myparameters: " + nextDateString + sensorID; // simplified dummy parameters
using (UnityWebRequest webRequest = UnityWebRequest.Get(requestParam))
{
webRequest.SetRequestHeader("Authorization", "Bearer " + jwtToken);
webRequest.SetRequestHeader("Content-Type", "application/json");
yield return webRequest.SendWebRequest();
// from unity api example
string[] pages = getUri.Split('/');
int page = pages.Length - 1;
if (webRequest.isNetworkError)
{
Debug.Log(pages[page] + ": Error: " + webRequest.error);
}
else
{
Debug.Log(pages[page] + ":\nReceived: " + webRequest.downloadHandler.text);
}
// getting the data i pulled out of the coroutine for further manipulation
this.tempText = webRequest.downloadHandler.text;
// show whats been pulled
print(this.tempText);
}
}
我一直在努力让一些 API 沟通工作。我正在使用 UnityWebRequests,因为我想构建为 WebGL(我尝试了 System.Net.WebRequest,它在游戏模式下工作,但与 WebGL 不兼容)。这可能只是协程的问题,但我会以半伪的方式向您展示我目前所拥有的以及我的问题是什么:
using UnityEngine;
using UnityEngine.Networking;
using System.Collections;
using System.Collections.Generic;
public class scking : MonoBehaviour
{
string tempText;
string getUri = "https://api.opensensors.com/getProjectMessages";
string jwtToken = "someToken";
private void Start()
{
pullAllData();
}
IEnumerator GetDataRequest(string currentDateString, string nextDateString, string sensorID)
{
string requestParam = "myparameters: " + nextDateString + sensorID; // simplified dummy parameters
using (UnityWebRequest webRequest = UnityWebRequest.Get(requestParam))
{
webRequest.SetRequestHeader("Authorization", "Bearer " + jwtToken);
webRequest.SetRequestHeader("Content-Type", "application/json");
yield return webRequest.SendWebRequest();
// from unity api example
string[] pages = getUri.Split('/');
int page = pages.Length - 1;
if (webRequest.isNetworkError)
{
Debug.Log(pages[page] + ": Error: " + webRequest.error);
}
else
{
Debug.Log(pages[page] + ":\nReceived: " + webRequest.downloadHandler.text);
}
// getting the data i pulled out of the coroutine for further manipulation
this.tempText = webRequest.downloadHandler.text;
// show whats been pulled
print(this.tempText);
}
}
void pullAllData()
{
int allDaysCount = 10;
List<int> sensorIds; // initialized with some ids
for(int i = 0; i < allDaysCount - 1; i++)
{
for(int j = 0; j < sensorIds.Count; j++)
{
StartCoroutine(GetDataRequest(i, i + 1, sensorIds[j]));
// show whats been pulled
print(this.tempText);
// parse json string this.tempText etc.
}
}
}
}
输出为(按时间排序)
来自 pullAddData:null
中的打印然后在协程中打印下一个:jsonItem
基本上,Coroutine 花费的时间太长,而且对于我的循环来说已经太晚了,无法继续,而且因为我得到一个 null,所以我当然无法解析或操作我的数据。或者我的整个工作都有缺陷,那么,如何正确地做到这一点?
非常感谢您对此提供的任何帮助。善良的菲利普
如果你想等 parallel 查看我对 Wait for all requests to continue
的回答如果你宁愿继续等待它们一个接一个你可以简单地将它们包装成一个更大的协程:
void pullAllData()
{
int allDaysCount = 10;
List<int> sensorIds; // initialized with some ids
// start the "parent" Coroutine
StartCoroutine(GetAllData(allDaysCount, sensorIds));
}
IEnumerator GetAllData(int allDaysCount, List<int> sensorIds)
{
for(int i = 0; i < allDaysCount - 1; i++)
{
for(int j = 0; j < sensorIds.Count; j++)
{
// Simply run and wait for this IEnumerator
// in order to execute them one at a time
yield return GetDataRequest(i, i + 1, sensorIds[j]);
// show whats been pulled
print(this.tempText);
// parse json string this.tempText etc.
}
}
// Maybe do something when all requests are finished and handled
}
IEnumerator GetDataRequest(string currentDateString, string nextDateString, string sensorID)
{
string requestParam = "myparameters: " + nextDateString + sensorID; // simplified dummy parameters
using (UnityWebRequest webRequest = UnityWebRequest.Get(requestParam))
{
webRequest.SetRequestHeader("Authorization", "Bearer " + jwtToken);
webRequest.SetRequestHeader("Content-Type", "application/json");
yield return webRequest.SendWebRequest();
// from unity api example
string[] pages = getUri.Split('/');
int page = pages.Length - 1;
if (webRequest.isNetworkError)
{
Debug.Log(pages[page] + ": Error: " + webRequest.error);
}
else
{
Debug.Log(pages[page] + ":\nReceived: " + webRequest.downloadHandler.text);
}
// getting the data i pulled out of the coroutine for further manipulation
this.tempText = webRequest.downloadHandler.text;
// show whats been pulled
print(this.tempText);
}
}