我在StackOverflow上查了很多类似的帖子,但由于我的lambda在Coroutine中,它们似乎没有接近我的问题。
我的代码:
public string FetchInternetItems()
{
WWW www = new WWW(someURL);
StartCoroutine(WaitForRequest(www, callback => {
if(!string.IsNullOrEmpty(callback))
{
Debug.Log("Successfully worked..");
}
else
{
return "Did not connect to remote server.";
}
}));
摘录自WaitForRequest
:
IEnumerator WaitForRequest(WWW www, Action<string> callback)
{
yield return www;
if (string.IsNullOrEmpty(www.error))
{
if (callback != null)
{
callback(www.text);
}
}
else
{
Debug.Log("WWW Error: " + www.error);
}
}
可在此处找到协程类:https://docs.unity3d.com/ScriptReference/MonoBehaviour.StartCoroutine.html
返回错误:
Anonymous function converted to a void returning delegate cannot return a value
理想情况下,我希望它返回callback
,除非没有任何内容,而是返回Did not connect to remote server.
消息。
答案 0 :(得分:4)
您的WaitForRequest
- 方法的参数类型为Action<string>
回调。 Action
只是返回 nothing (void
)的方法的委托,因此您无法在此类委托中调用return ...
。但无论如何你的设计似乎都被打破了。如果出现错误,你会返回一个字符串,如果一切正常,你想要返回WWW
- 这个似乎有点矛盾的实例,不是吗?
您可以在发生错误时抛出异常而不是返回字符串:
IEnumerator WaitForRequest(WWW www, Action<string> callback)
您现在可以这样称呼:
StartCoroutine(WaitForRequest(www, callback =>
{
if(!string.IsNullOrEmpty(callback))
{
Debug.Log("Successfully worked..");
}
else
{
throw new Exception("Did not connect to remote server.");
}
}
这里的想法是,如果你无法连接到服务器,你的应用程序就无法继续正常工作,所以你可以带着例外离开。
答案 1 :(得分:1)
查看您的方法签名:
return "Did not connect to remote server.";
它希望你返回一个字符串。
不是从方法范围返回字符串,而是从匿名方法返回它。
FetchInternetItems()
上面这句话说你试图从匿名方法返回一个字符串,这不允许它导致跟随错误:
匿名函数转换为void返回委托不能 返回一个值
coroutine
会在不等待WaitForRequest
FetchInternetItems()
完成的情况下结束执行。因此两个执行都没有相关。话虽如此,您将无法使用您在public void FetchInternetItems(Action<string> callBack);
中返回的响应字符串。
要解决此问题,一个简单的解决方案是将签名更改为
FetchInternerItems( result => { Debug.Log("This is response text from www : " + result);});
这就是你怎么称呼这个方法:
FetchInternerItems(OnCompleted);
void OnCompleted(string response)
{
Debug.Log("This is response text from www: " + response);
// You can do other stuff here...
}
或者像这样:
{{1}}
如果还有更多要知道的话。请在评论部分询问。希望这会有所帮助。