2016-09-26 85 views
0

我查了很多類似的帖子在StackOverflow上,但他們似乎並沒有接近我的問題,因爲我的lambda在協程中。什麼是從匿名函數返回值的內聯語法?

我的代碼:

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

聽起來像'WaitForRequest'的第二個參數是一個void委託,在這種情況下它不能返回值。你認爲它會迴歸他的價值? –

+0

好的。這就說得通了。我期望一個'string'值。我很抱歉不包括該方法。 – Trip

+0

我的問題是應該返回什麼值_receive_?代碼只是開始一個協同例程,所以沒有什麼可以收到回報的。另外,'Asction '會返回一個'字符串',但是你不能用它來代替'Action ' –

回答

4

您的WaitForRequest -method具有類型Action<string>回調的參數。 Action只是返回void)的方法的代表,因此您不能在這樣的代理中調用return ...。但是,無論如何,你的設計似乎都被打破了。如果出現錯誤,你會返回一個字符串,如果一切正常,你想返回一個似乎有點矛盾的例子,不是嗎?

你可以只扔在一個錯誤的情況下的異常,而不是返回一個字符串:

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."); 
    } 
} 

這裏的想法是,如果你無法連接到服務器,因此您的應用程序無法繼續正常工作,因此您可以保留一個例外。

+0

這樣做更有意義。我非常想拋出一個異常而不是一個字符串。我會嘗試一下 – Trip

+0

啊,這讓很多。非常感謝這個迴應。如果我像上面提到的那樣將返回值切換爲無效,那麼似乎會導致我的方法'WaitForRequest'說'不能作爲迭代器塊,因爲void不是迭代器接口類型',然後我的'FetchInternetItems'失敗,因爲'無法從void到System.Collections.IEnumerator' – Trip

+0

你應該提供'StartCoroutine'的代碼,我想它無論出於何種原因都期望有一個'Enumerator'類型的參數。 – HimBromBeere

1

看一看你的方法簽名:

public string FetchInternetItems() 

它期望你返回一個字符串。

不是從方法作用域返回字符串,而是從匿名方法返回它。

return "Did not connect to remote server."; 

上面一行說,你正在試圖返回從匿名方法的字符串,不允許它引起以下錯誤:

Anonymous function converted to a void returning delegate cannot return a value

FetchInternetItems()將結束它的運行,而無需等待coroutineWaitForRequest到完。所以兩個執行都不相互關聯。話雖如此,您將無法使用您在FetchInternetItems()中返回的響應字符串。

要解決這個問題,一個簡單的解決方案是將簽名改爲

public void FetchInternetItems(Action<string> callBack); 

這是你將如何調用此方法:

FetchInternerItems(result => { Debug.Log("This is response text from www : " + result);}); 

OR這樣的:

FetchInternerItems(OnCompleted); 


void OnCompleted(string response) 
{ 
    Debug.Log("This is response text from www: " + response); 
    // You can do other stuff here... 
} 

如果還有更多需要知道的。請在評論部分提問。希望這可以幫助。