All Articles

Promise与Async/Await

Promise与Async/Await(JS)

今天的主题是分享JavaScript里面的几个特别的用法。下面这几个单字都是跟JavaScript有关的,肯定有很多人不曾听过吧

Javascript的同步处理与非同步处理

最近因为在做项目的时候遇到了一个很难的需求,就是要取代浏览器里面的alert和confirm。因为原生的这两个套件长的太丑了,而且也没有提供接口可以让码农们对它进行调整。先上图。 2022 11 18 09 42 51

2022 11 18 09 44 00

但不要小看这两个不起眼的画面,它提供了一个特殊的功能,像一个红绿灯一样,让所有正在处理中的工作停留在原地,等待使用者按下一个按钮。如果不使用者两个特别的功能,要自己实装出同样的东西,那可是大工程了,并且一定会遇到同步的问题。先上一个美美的绣花枕头,也就是改造后的画面:

2022 11 18 09 48 04

什么是同步

同步问题听中文不容易理解,遇到不能理解的事情没有什么不能用代码解决的,啊说错了,是流程图,先看看下方流程图。

井然有序是很重要的,如果有人插队的话那逻辑就会混乱的!这个就叫做同步处理。即使上述的work2很花时间,还是会等待work2结束后,才进行work3.就好象是一定要先煮饭好才能吃饭一样的天经地义。

什么是异步

但在Javascript的时间里事情经常不是如此。如果上图的work2是需要“被等待”的话,即使只需要等待1毫秒,就会马上被归类为异步处理,事情通常会变成这样。

这个时候就会变成work3先被优先执行,让work2在旁边慢慢执行了。也就是不等饭煮好就先去外面吃了,让饭在家里慢慢煮。

这样的设计的优点就是遇到真的很花时间的处理,也不会让使用者焦急等待,可以先去做其他的工作。但在需要确保流程正确的处理下,这就会出现问题。

要如何确保让work2完成前,不执行work3,这就要用到关键字来指定了。

Promise与Async/Await

这3个单字,分别是承诺,同步,等待。他们之间的关系比较难说清楚,先来看代码:

2022 11 18 10 18 15

上面代码执行结果是

2022 11 18 10 19 21

接下来我们加个关键字,async到程序里:

2022 11 18 10 20 21

这时候的输出是

2022 11 18 10 21 29

这里我们看到了Promise了!这里揭示了一个法则,就是将所有的function加上async的关键字后,它的返回值都会变成Promise:

  • 如果原先返回了一个1,它返回Promise
  • 如果原先返回True,它还是返回Promise

这就造成了一个问题,原本后续处理可能是跟着if判断的,但变成了Promise后,就无法进行原来的判断了,因为它在也无法返回布林值。同理以此类推。

下面这两个函数其实是同样的意思

我们知道了Promise如何产生后,也能够理解这两个函数其实是同样一回事了。

如何取回返回值?

async函数所说的承诺(Promise),都要经过等待(await),才能取回原来的值。 在看一下下面的代码:

Promise是什么

2022 11 23 21 07 56

Promise具有状态、叫做PromiseStatus,包含了下面三种情况。

  • pending: 等待处理结束
  • resolved: 处理结束并且没有出现错误,接着Then处理
  • rejected: 处理结束但没有成功,接着Catch处理

想要把异步处理和同步处理相结合,着实不容易。除非在系统设计时候进行考虑,或是使用成熟框架之外,就只能够追着函数不停的加async,然后在返回值的地方加await。

结论

估计还可以在写几千字,但还是打算就此打住,当作概念介绍,有真正遇到课题的朋友,可以到网上查看更多资料。