首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

JS异步编程,2/3。callback,promise

今天整理一下JS中异步相关问题,缘起是同事的讨论。大概是三部分,1,异步是什么。2异步的语法。3异步的实现eventloop。 今天是第二部分,由以下的话题组成:

4 回调函数,callback5 Promise4 回调函数,callback

异步执行的代码,最常见的一个问题就是当异步代码执行完毕后,才需要执行的某些代码如何处理?例如,当网络请求完成后,再执行渲染任务。这个网络请求就是异步执行的,而渲染任务就必须要是网络请求成功后才能执行。如何保证呢? 最经典的方式就是回调函数了。就是告诉异步代码,在执行完成后,应该去执行哪些代码,这些要被执行的代码,被定义成一个函数作为参数,称之为回调函数,callback。

以nodejs的异步文件操作为例,示例代码:

fs.readFile() 就是异步代码,其中 就是异步的回调函数,在文件内容读取完毕后执行! 后边输出了一行 after readFile,先于文件内容输出吗?

回调函数是一个非常通用,好用,经典的异步解决方案。但也有典型问题,主要有两个:

非常容易出现callback hell回调地狱,指的是多层的毁掉嵌套,导致代码维护、重构成本增加。

回调函数中的异常,在外部不容易被捕获。因为异步回调函数的执行,是在其他的执行tick(执行周期)完成的。

回调函数还是非常好用的,即使有问题,个人觉着也就算有瑕疵而已,无伤大雅!

5 Promise

Promise 也是异步编程的一种解决方案,与回调函数相比,语法上合理些。最早由社区实现,ES6(ES2015)将其写进了语言标准,原生提供了Promise对象。因此从功能上说与回调函数方案解决的是同类问题,只是语法形式不同,从而带来了不同的语法体验!

基础语法结构如下,先得到Promise对象,再完成异步后的操作:

Promise,承诺的意思,语义上指的是保证一个异步任务执行完后,告知你执行结果,成功或失败。我们使用Promise方案来实现nodejs中异步读取文件的操作,在NodeJS中提供了Promise的语法,示例如下:

fs.promise 在当前版本(v11.10)中还是:Stability: 1 - Experimental 状态,不要用在生产环境

fsPromises.readFile 会返回一个Promise对象,之后使用.then()处理成功的状况,或者.catch()处理失败的状况。 上面的代码中,.then()中的函数,就相当于回调函数。

Promise 的语法会使嵌套异步代码变得扁平化,一般会说“使用同步的语法编写异步程序”,下面对比回调和Promise的语法,加以说明:

callback演示:

Promise演示:

以上功能一致的两段代码,callback需要多层嵌套,而promise需要连续的.then()即可。对比可见Promise使得异步代码更加扁平了,更加同步化了。

除了解决了大量的嵌套问题,Promise在处理异常错误时也更有语法优势,.catch(func) 结构就是在Promise异步执行失败(有错误)时,执行的代码,结构上与.then()是同级的。这样Promise解决方案就在实现异步的同时,解决了回调函数的典型问题,很好用的。

待续…

接下来:Generator,async,await,eventloop

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20190222G006VZ00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券