在 Cocos Creator 实现协程?——源码分享

https://gitee.com/afrx_s_projz/cocos_creator_start_coroutine

原理非常简单,其实就是用 yield 关键字来实现的。
在 lateUpdate 中来调用。

为了解释方便,我自己写了 7 个小例子,一步一步解释怎么实现协程的逻辑。

之所以自己撑得没事干,弄了个协程出来,
就是因为回调函数是在是太头疼了。
官方的 API 又不能直接使用 async、await 形式(需要通过 Promise 包装一下),所以只好自己鼓捣出一个怪物来……

在实际项目中已有应用,确实减少了很多回调嵌套。


【2022/05/22 最新编辑】
坛子里的朋友强烈提醒我没用过 Promise,所以我在最后一个例子中补充了 async、await + Promise 的形式,来给自己挽回点面子。

不过这倒是小事儿……

我又重新思考了一下 MyCoroutine 那段代码,它的一个特征是“模拟多线程”。

消除回调只是其中一个功能而已。

不过,多线程这玩意儿,本身就是个怪物。别碰!

想想自己为什么会鼓捣个怪物出来?

大概是因为写 Java 和 Golang 比较多,习惯开线程的思路。

就当猎奇吧……

为什么不能用await和async?楼主可能还不会用Promise吧,多逛逛论坛,多使用搜索:mag_right:功能,可能会增加你的知识

估计他说的是cc.tween这种api

其实自己封装一下, 哪怕用setTimeout也能resolve

cocos 2.x 的版本,调用其原生 api 的时候,怎么 async、await?能用我不是早用了么。所有功能都是通过 onComplete 完成的。是说把 onComplete 包装成 promise 么?

我不是要完成一个动画,干那么简单的事情。最终目的是要消除烦人的回调。

tween回调和其他回调有区别吗?不都一样,是楼主自己没用过Promise

百度Promise和await结合使用

我补充了最后一个例子,使用了 async、await。感谢你的提醒。

我重新思考了一下 MyCoroutine。

MyCoroutine 的另外一个特征是模拟多线程,消除回调只是其中一个功能点。

要说消除回调这件事,其实办法比较土,就是靠“信号量”这种机制死等。

但是要说回到多线程,多线程本身就是个怪物……

new 一个promise不就能用了

function foo(){
return new promise((reslove,reject)=>{
cc.tween(node).to().call(function(){
reslove('ok)
}).start()
})
}

async check(){
let p = await foo()
console.log§ // ‘ok’
}

lz 源码还有吗 最近unity 转cocos TS不会用协程 很难受

了解一下 JS 的 async 和 await,注意在异步操作里使用引擎对象的话要关注一下是否已经被销毁(用 isValid