Unity – 只需在协同程序完成后才能返回值

我正在进行团结游戏并遇到一个我无法解决的问题。 我通过标准的WWW对象连接到Web服务器并使用协程来执行POST请求。

代码本身可以工作,但我需要更新变量值并在协程完成后返回该变量,这是我无法做到的。

public int POST(string username, string passw) { WWWForm form = new WWWForm(); form.AddField("usr", username); form.AddField("pass", passw); WWW www = new WWW(url, form); StartCoroutine(WaitForRequest(www)); //problem is here ! return success_fail; } private IEnumerator WaitForRequest(WWW www) { yield return www; if (www.error == null) { if(www.text.Contains("user exists")) { success_fail = 2; } else { success_fail=1; } } else { success_fail=0; } } 

协程使用相关值更新’success_fail’的值。 但是’return success_fail;’ POST方法中的行在协同程序完成之前运行,这会导致它返回false值。

我试图使用额外的协同程序,但没有成功,假设我也有错误。 如何在协程完成后返回’success_fail’值?

谢谢。

只有一个协程可以等待另一个协同程序。 由于您需要等待您启动的协程(WaitForRequest),这意味着您必须将POST转换为协程并且它将无法返回int。

看起来success_fail是一个成员变量,所以如果它暴露给谁开始POST(作为协程),你无论如何都不需要返回它。

 public int success_fail IEnumerator POST(string username, string passw) { WWWForm form = new WWWForm(); form.AddField("usr", username); form.AddField("pass", passw); WWW www = new WWW(url, form); yield return StartCoroutine(WaitForRequest(www)); } private IEnumerator WaitForRequest(WWW www) { yield return www; if (www.error == null) { if(www.text.Contains("user exists")) { success_fail = 2; } else { success_fail=1; } } else { success_fail=0; } } 

基本上,如果你想让你的代码“等待”,它必须是一个协程。 你不能在没有阻塞整个引擎的情况下进行等待的调用(没有某种类型的循环破解)。

这个线程提供了一种方法,如果你真的需要,你可以从你的协程返回int,但POST仍然不能成为阻塞调用…

http://answers.unity3d.com/questions/24640/how-do-i-return-a-value-from-a-coroutine.html

函数不会在返回之前等待协同程序,但是您可以使用Action来提供某种返回。

把它放在你的启动function中

 WWW www = new WWW("http://google.com"); StartCoroutine(WaitForRequest(www,(status)=>{ print(status.ToString()); })); 

并添加这个。

 private IEnumerator WaitForRequest(WWW www,Action callback) { int tempInt = 0; yield return www; if (string.IsNullOrEmpty(www.error)) { if(!string.IsNullOrEmpty(www.text)) { tempInt = 3; } else { tempInt=2; } } else { print(www.error); tempInt=1; } callback(tempInt); } 

尝试一下,虽然函数可以更改一个值,但它不返回值,只有一个参数。 所以本质上这不是一个返回你的协程的解决方案,但是一旦从协程接收到int,我们就可以certificate如何处理它甚至在回调中调用其他函数。

 StartCoroutine(WaitForRequest(www,(status)=>{ print(status.ToString()); Awake(); // we can call other functions within the callback to use other codeblocks and logic. if(status != 0) print("yay!"); } )); 

这可能对你有用。 http://answers.unity3d.com/questions/744888/returning-an-ienumerator-as-an-int.html