IT科技

JS异步编程有哪些方案?为什么会出现这些方案?

时间:2010-12-5 17:23:32  作者:系统运维   来源:数据库  查看:  评论:0
内容摘要:关于 JS 单线程、EventLoop 以及异步 I/O 这些底层的特性,我们之前做过了详细的拆解,不在赘述。在探究了底层机制之后,我们还需要对代码的组织方式有所理解,这是离我们最日常开发最接近的部分

 

关于 JS 单线程、异步有方EventLoop 以及异步 I/O 这些底层的编程特性,我们之前做过了详细的出现拆解,不在赘述。异步有方在探究了底层机制之后,编程我们还需要对代码的出现组织方式有所理解,这是异步有方离我们最日常开发最接近的部分,异步代码的编程组织方式直接决定了开发和维护的效率,其重要性也不可小觑。出现尽管底层机制没变,异步有方但异步代码的编程组织方式却随着 ES 标准的发展,一步步发生了巨大的出现变革。接着让我们来一探究竟吧!

回调函数时代

相信很多 nodejs 的异步有方初学者都或多或少踩过这样的坑,node 中很多原生的编程 api 就是诸如这样的:

fs.readFile(xxx, (err, data) => {  }); 

典型的高阶函数,将回调函数作为函数参数传给了readFile。网站模板出现但久而久之,就会发现,这种传入回调的方式也存在大坑, 比如下面这样:

fs.readFile(1.json, (err, data) => {      fs.readFile(2.json, (err, data) => {          fs.readFile(3.json, (err, data) => {              fs.readFile(4.json, (err, data) => {              });         });     }); }); 

回调当中嵌套回调,也称回调地狱。这种代码的可读性和可维护性都是非常差的,因为嵌套的层级太多。而且还有一个严重的问题,就是每次任务可能会失败,需要在回调里面对每个任务的失败情况进行处理,增加了代码的混乱程度。

Promise 时代

ES6 中新增的 Promise 就很好了解决了回调地狱的问题,同时了合并了错误处理。写出来的代码类似于下面这样:

readFilePromise(1.json).then(data => {      return readFilePromise(2.json) }).then(data => {      return readFilePromise(3.json) }).then(data => {      return readFilePromise(4.json) }); 

以链式调用的方式避免了大量的嵌套,也符合人的线性思维方式,大大方便了异步编程。亿华云

co + Generator 方式

利用协程完成 Generator 函数,用 co 库让代码依次执行完,同时以同步的方式书写,也让异步操作按顺序执行。

co(function* () {    const r1 = yield readFilePromise(1.json);   const r2 = yield readFilePromise(2.json);   const r3 = yield readFilePromise(3.json);   const r4 = yield readFilePromise(4.json); }) 

async + await方式

这是 ES7 中新增的关键字,凡是加上 async 的函数都默认返回一个 Promise 对象,而更重要的是 async + await 也能让异步代码以同步的方式来书写,而不需要借助第三方库的支持。

const readFileAsync = async function () {    const f1 = await readFilePromise(1.json)   const f2 = await readFilePromise(2.json)   const f3 = await readFilePromise(3.json)   const f4 = await readFilePromise(4.json) } 

这四种经典的异步编程方式就简单回顾完了,由于是鸟瞰大局,我觉得知道是什么比了解细节要重要, 因此也没有展开。不过没关系,接下来,让我们针对这些具体的解决方案,一步步深入异步编程,理解其中的本质。源码下载

copyright © 2025 powered by 益强资讯全景  滇ICP备2023006006号-31sitemap