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

The order of command execution in Unity 5 using StartCoroutine / yield return www

有 2 个 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);
        }
    }
}

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

如何先得到服务器的响应,然后再继续程序? 我做错了什么?

看这里:

StartCoroutine(WaitForRequest(www));
return www;

您的方法 returns www 对象,无需等待 WaitForRequest(www) 完成。如果你没有使用 www returned 从 POST() 方法为什么你 return 它。

如何解决:

传递 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();
    }
}

希望对您有所帮助