typescript保证同步的理解

首先,我先说一下:恕我直言,脚本真JB操蛋,虽然TS引入了类型,因为兼容JS,也是操蛋。再加上nodejs的事件循环。官方文档不人性,小众语言,尼玛,不给初学者活路。

OK,发泄完了,现在来说下TS对于异步事件的同步控制吧。

关键字:promise,async,await,事件循环,异步IO具体怎么实现的自己去看。

如果你要控制一小段的同步:比如查询A表之后,根据A的数据再去删除B数据

那么基本的套路

(async function() 

{

    await queryA();

   console.log("xxxx");

   await deleteBAccordingA();

})();

(备注1:JS用的是回调的方式:就是查询A的回调里再去删除B,如果这个流程长的话,那就是回调地狱了,维护起来跟吃屎一样)

(备注2:要控制同步的步骤必须写在async函数中,里面要用await去控制,await后面跟的函数必须返回一个promise)

说完基本的套路。

现在我们来理解下具体如何写好这个功能:

1。返回promise的函数如何写:

function queryA()

{

//异步操作1

//异步操作2

}

如上,如果在上述函数中,有两个异步函数,如果你要保证queryA的2个异步都要操作完,才能去deleteBAccordingA的话,那么要让两个异步操作完,再返回Promise的resove或者reject。切记await是通过Promise的2个resolve和reject来实现同步,pengding是Promise的初始状态不参与这个。如果异步1你参与返回Promise状态,异步2参与了,那么就只有异步2参与了同步。异步1与该同步链无关,自己做自己的事。

     OK,现在返回async函数中。

(async function() 

{

  console。log("oooo");

   //没await控制的异步操作 step1

    await queryA();

   console.log("xxxx");

//没await控制的异步操作 step2

   await deleteBAccordingA();

})();

现在讲下,该程序如何跑的:

首先同步打出ooo没什么问题。

然后是step1的异步操作。一看到这个,就直接把他扔个系统的另外几个线程去做异步IO,他不参与我们的同步链,不管他们了。

之后是await控制的queryA,那么aynsc函数中queryA后面的代码段全部跳过,执行其他的函数,这边不显示了。

那么到了下个事件循环或者下下个事件循环,queryA中的异步操作返回了我们要的resolve状态,如果是reject的状态的话,那么一般都是出错,此处不考虑。得到resolve之后,接着走下面的代码段,这里可以理解为本次事件循环的同步运行。所以xxx直接被打印出来。如果又碰到不受同步链控制的异步操作step2,直接扔个其他的线程,反正他和我们的同步链不相互影响。

最后看到await,也是到deleteBAccordingA去获取Promise的resolve,得到之后才能去走下面。当然此处异步函数已经走到尽头了。

猜你喜欢

转载自blog.csdn.net/Allen_Walker_QAQ/article/details/81238355