js和c#的异步解决方案对比,理解promise和await以及async
·
楼主最近在学习c#里的协程,发现c#的异步解决方案和js异步的解决方案也太像了,没想到学习c#的过程中把javascript的promise和await以及async 理解明白
首先是c#的协程
using UnityEngine;
public class CoroutineExample : MonoBehaviour
{
// 启动协程
void Start()
{
//~~~~~~~~~~~~
//~~~~~~~~~~~~
//一系列的同步代码
StartCoroutine(MyCoroutine());//开始执行协程
}
// 协程函数
IEnumerator MyCoroutine()
{
//此时依然是同步代码
Debug.Log("Start coroutine");
//遇到yield retur 暂停 2 秒 协程,将控制权返还给主线程,
yield return new WaitForSeconds(2f);
//两秒后继续恢复协程函数的执行
Debug.Log("End coroutine after 2 seconds");
}
}
c#协程的执行过程可以理解为,首先start函数开始,同步的执行代码,开启协程函数执行依然还是同步状态,直到遇到了yield return语法才暂停吧控制权给主线程执行,等待2秒后,继续执行协程函数生下的内容
现在继续说一下js里的异步解决方案
//主线程代码执行
console.log("开始");
async function runTasks() {
// 这里遇到了await关键字(await关键字的特性:当await的promise return时候就会暂停runTasks代码的执行,将控制权给主线程)
await task1();
//跟上面同理
await task2();
console.log("所有任务完成");
}
async function task1() {
//进入task1继续执行
console.log("执行任务 1");
//遇到return 暂停runTasks函数的执行知道promise完成resolve
return new Promise((resolve) => setTimeout(resolve, 1000)); // 模拟异步操作
}
async function task2() {
console.log("执行任务 2");
return new Promise((resolve) => setTimeout(resolve, 1000)); // 模拟异步操作
}
//遇到函数并进入
runTasks();
// 执行runTasks函数的过程中遇到await暂停runTasks函数的执行,将控制权给主线程执行下面的
console.log("结束");
执行结果

虽然注释有详细的过程,不过也将一下大概流程,首先大家得了解await和async的特性
async特性:
1、 async关键字加在函数里,这个函数即使什么都不做,都会返回一个promise
async function myFunction() {
return 1; // 自动被包装成 Promise.resolve(1)
}
await的特性:
1、await会自动将后面的数据包装成promise.resolve
2、await如果是放在函数前面,这个函数会在return 一个promise的时候,暂停async修饰函数的方法的执行,控制权会交给主线程执行
async function example() {
let result = await 42; // 42 会被包装成 Promise.resolve(42)
console.log(result); // 输出:42
}
ok,现在根据这两个特性,所以整个代码的执行流程为,
1、首先,主线程代码执行“开始”,遇到了runTasks方法进入,
2、遇到了await task1();并进入,执行输出语句“执行任务 1”,返回一个promise,此时根据await的特性,由于promise的延迟1秒才resove,此时会暂停runTasks的执行,
3、将执行权交给主线程,继续执行“结束”,
4、一秒过后,恢复runTasks的执行,继续执行 await task2,
6、跟上面执行task1同理,执行了输出语句“执行任务 2”,此时又延迟了一秒,
7、最后执行“结束”
有什么不对欢迎指正,此贴用于记录避免忘记
更多推荐



所有评论(0)