Unity 5中使用StartCoroutine / yield return www的命令执行顺序

3

有两个C#脚本,附加到同一个游戏对象上(Unity 5.4)

public class SignIn : MonoBehaviour
{
    private SendRequest sendRequest;

    void Start()
    {
        sendRequest = GetComponent<SendRequest>();
    }

    public void signInPressed()
    {
        WWWForm form = new WWWForm();
        form.AddField("key", "value");

        sendRequest.POST(mainSettings.appUrl, form);

        Debug.Log("SIGNIN");
    }
}

并且

    public class SendRequest : MonoBehaviour {

    public WWW POST(string url, WWWForm form)
    {
        WWW www = new WWW(url, form);

        StartCoroutine(WaitForRequest(www));
        return www;
    }

    private IEnumerator WaitForRequest(WWW www)
    {
        yield return www;

        if (www.error == null)
        {
            Debug.Log("WWW Ok!: " + www.text);
        }
        else
        {
            Debug.Log("WWW Error: " + www.error);
        }
    }
}

当我尝试执行这些脚本时,首先显示登录行,然后是服务器响应。

如何先从服务器获取响应,然后再继续程序? 我做错了什么吗?

1个回答

3

看这里:

StartCoroutine(WaitForRequest(www));
return www;

您的方法在不等待WaitForRequest(www)完成的情况下返回www对象。如果您不使用从POST()方法返回的www,为什么要返回它呢?
解决方法:
传递一个delegate参数,在coroutine完成时触发。
例如:
sendRequest.POST(mainSettings.appUrl, form, () => { Debug.Log("SIGNIN");});

下面是POST()的定义:

public WWW POST(string url, WWWForm form, Action callback = null)
{
    WWW www = new WWW(url, form);

    StartCoroutine(WaitForRequest(www, callback));
}

关于WaitForRequest()的定义:

private IEnumerator WaitForRequest(WWW www, Action callback = null)
{
    yield return www;

    if (www.error == null)
    {
        Debug.Log("WWW Ok!: " + www.text);
    }
    else
    {
        Debug.Log("WWW Error: " + www.error);
    }

    if(callback != null)
    {
        callback();
    }
}

希望它能帮到你。

非常感谢!非常有帮助! - Eugene

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接