0

我正在尝试从协程方法返回 UnityWebRequest 请求的结果,我想到了类似于以下代码的内容:

    private IEnumerator<string> SendPostWebRequest(string url)
    {
        WWWForm form = new WWWForm();
        form.AddField("Key", "Value");

        using (UnityWebRequest request = UnityWebRequest.Post(url, form))
        {
            yield return request.SendWebRequest();

            if (!request.isNetworkError && !request.isHttpError && request.isDone)
                yield return request.downloadHandler.text;

            yield return string.Empty;
        }
    }

但是这一行有一个错误(yield return request.SendWebRequest()),我不知道如何解决它!(这里需要一个 yield 来等待请求完成)。

4

1 回答 1

1

我可以看到这个函数的返回类型是 IEnumerator,并注意到 'request.SendWebRequest();' 返回一个任务。所以解决这个问题的第一件事是删除泛型类型,就像这样:

private IEnumerator<string> SendPostWebRequest(){....}

另一方面,您需要返回一个字符串。根据 Unity 的文档,以下代码应该适用于函数不是协程的情况:

string str = (string) SendPostWebRequest(...);

这将强制转换 IEnumerator 中产生的所有元素,并将返回其上的第一个字符串元素。

但是,这是一个协程,根据我的经验,这不起作用。我想出并且我通常使用的解决方案是使用 lambda 函数。

要解决这个问题,您需要向函数添加一个额外的参数,即一个 Action(基本上是函数引用),以便您可以从 SendPostWebRequest() 函数执行它。我听起来很困惑,但看看这段代码。这就是我通常实现这种事情的方式。

public void ExampleFunction(){
    // Using lambda function
    StartCoroutine(SendPostWebRequest("www.google.es", (string ReturnResult)=> 
           Debug.Log(ReturnResult)
    ));

    // Using functions references
    StartCoroutine(SendPostWebRequest("www.google.es", OtherResultManagementFunction));
}

private void OtherResultManagementFunction(string ReturnResult){
    Debug.Log(ReturnResult);
}

private IEnumerator SendPostWebRequest(string url, Action<string> FinishDelegate)
    {
        WWWForm form = new WWWForm();
        form.AddField("Key", "Value");

        using (UnityWebRequest request = UnityWebRequest.Post(url, form))
        {
            yield return request.SendWebRequest();

            if (!request.isNetworkError && !request.isHttpError && request.isDone)
                yield return request.downloadHandler.text;

            FinishDelegate("WHATEVER STRING");
        }
    }

泛型Action指定了封装在Action对象中的函数的返回时间。

两个协程的工作方式完全相同,但第一个使用 lambda 函数,另一个使用函数引用。如果执行,两者都将打印从 webrequest 返回的字符串(在本例中为“WHATEVER STRING”)。

希望这对你有用,在大多数情况下,这对我来说是最好的解决方案。

于 2019-09-03T08:31:36.680 回答