我有一些代码需要从Web服务器请求一些数据。我在具有一些参数并应返回返回数据的函数中执行此操作。参见下面的代码:
public string[] GetDBValues(int type, string[] data){
string base_url = "http://localhost/artez/onderzoeks_opdracht/interface_test/get_elements.php";
string typePrefix = "?type=";
string dataPrefix = "data[]=";
string uriString = base_url + typePrefix + type;
foreach (string dataElement in data){
uriString += "&" + dataPrefix + dataElement;
}
string[] db_objects = null;
StartCoroutine(UrlData(uriString, (result) =>{
string clean_data = Regex.Replace(result, @"[""\[\]]", "");
db_objects = clean_data.Split(',');
}));
return db_objects;
}
但是当我运行这段代码时,返回的数据为空,因为返回的数据为空数组,然后再将其填充为来自Web服务器的数据。我该如何做才能使数据仅在Web请求完成后才返回?
我尝试在StartCoroutine
中设置返回值,但是该函数无法编译。
如果不清楚,请告诉我,以便我澄清!
答案 0 :(得分:0)
您需要回调以将值传递出方法。
public void GetDBValues(int type, string[] data,
Action<string[]> returnMethod) // Extra parameter
{
// Same code here
StartCoroutine(UrlData(uriString, (result) =>{
string clean_data = Regex.Replace(result, @"[""\[\]]", "");
db_objects = clean_data.Split(',');
returnMethod(de_objects); // Here it returns
}));
}
所以你这样打电话:
string result = GetDBValues(0, new string[]{"a"});
现在您这样打电话:
string result = null;
GetDBValues(0, new string[]{"a"}, (str)=>{ result = str});
现在,这已相当简化。因为您的代码不会在GetDBValues调用时暂停,所以它可能会更复杂,但是考虑到您有一个Text字段,那么您将按以下方式进行操作:
Text text;
void Start()
{
text.text = "N/A";
GetDBValues(0, new string[]{ "a" }, (strs)=>
{
if(strs == null)
{
text.text = "Something went wruung";
return;
}
// print concatenated version of the result
for(int i = 0; i < strs.Length;i++){ text.text += strs[i]; }
});
}
这样,文本将以“ N / A”开头,下载完成后将更改为适当的值。