为何先调用的协程(Coroutine)会晚于普通函数执行?
问题原因
Unity的StartCoroutine不会阻塞主线程,你调用StartCoroutine(checkClass(studentId))后,主线程会立刻执行后续的print和JoinClass方法,而checkClass里的网络请求要等yield return w完成后才会给classCheckList赋值,这就导致JoinClass执行时classCheckList还没被正确初始化,自然会先跑起来。
解决办法
把OnJoinClass改成协程,用yield return等待checkClass执行完毕后再调用JoinClass:
修改后的OnJoinClass协程
public IEnumerator OnJoinClass() { // 等待checkClass协程完全执行结束 yield return StartCoroutine(checkClass(studentId)); print(classCheckList.Length); JoinClass(studentId, InputClassCode.text); print("succes"); }
然后把原来调用OnJoinClass的地方改成启动这个协程,比如按钮点击事件:
// 替换原来直接调用OnJoinClass()的代码 StartCoroutine(OnJoinClass());
额外优化建议
JoinClass里的WWW请求也是异步操作,同样建议改成协程,避免后续逻辑出现类似顺序问题:
public IEnumerator JoinClass(string id_Student, string id_Class) { isJoined = false; for (int i = 0; i < classCheckList.Length; i++) { print(classCheckList[i] + "==" + id_Class + "\n"); if (classCheckList[i] == id_Class) { print(classCheckList[i]); isJoined = true; break; // 找到匹配项后直接跳出循环,提升效率 } } if (!isJoined) { WWWForm form = new WWWForm(); form.AddField("addStudentId", id_Student); form.AddField("addClassId", id_Class); WWW www = new WWW(URL4, form); yield return www; // 等待请求完成 // 可在此处理请求结果 if(string.IsNullOrEmpty(www.error)) { print("加入班级成功"); } else { print("加入班级失败:" + www.error); } } else { print("Sudah Masuk Kelas"); } }
此时OnJoinClass里调用JoinClass也要改成等待:
public IEnumerator OnJoinClass() { yield return StartCoroutine(checkClass(studentId)); print(classCheckList.Length); yield return StartCoroutine(JoinClass(studentId, InputClassCode.text)); print("success"); }
- 提前初始化
classCheckList,避免空引用异常:
private string[] classCheckList = new string[0];
内容的提问来源于stack exchange,提问作者Tirtaodd997
相关产品推荐
相关产品推荐

