楼主最近在学习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、最后执行“结束”

有什么不对欢迎指正,此贴用于记录避免忘记

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐