nodejs 回调函数 里面赋值给外面_FIBJS模块重构—从回调到协程

本文介绍了 FIBJS 核心贡献者陈垒在 D2 论坛的演讲,探讨了从 NodeJS 的回调函数到 FIBJS 的协程重构,解决异步流程控制的问题。通过示例比较了 NodeJS 中回调、Promise 和 async/await 的使用,以及 FIBJS 中利用轻量级逻辑锁和协程实现同步风格的异步处理。FIBJS 提供了一种避免回调地狱的方案,同时在性能和内存管理上表现出优势。
摘要由CSDN通过智能技术生成

来自FIBJS核心贡献者陈垒在 D2 的演讲 “FIBJS模块重构—从回调到协程”。

JS的应用非常广泛,例如做一些浏览器的发展、机器学习、控制机器人以及编写嵌入式的应用。

7b3b88b582123ca8898b9acfacdcedf1.png

如上图所示为使用浏览器原生的对象发送一个请求的典型例子。首先创建了一个xhr对象,接下来的一步并不是马上发送它,而是要设一个回调函数onreadystatechange,这个函数表示请求完成以后怎样处理返回结果。xhr也定义了本次请求要发送的HTTP动词和发送的目标网址,直到最后一步才真正将请求发送出去。但是,这个代码是异步的,当send运行之后,代码继续执行,很可能代码没有完成,等到请求完成后才可以处理。像xhr的请求,它的异步过程的执行顺序和声明顺序不一致,先定义回调再发送请求,这种情况称之为异步。因此,要求执行顺序和声明顺序严格一致。现代的应用不是单纯的同步或者异步,往往是两者的混合,时而同步时而异步,所以如何按需处理同步和异步的流程一直是一个热门问题。

01a7b1c7036947077884bf320da9dc55.png

也可以使用Promise把异步流程转换到同步,如上图所示。浏览器首先提供了一个fetch方法,发起一个fetch请求,通过then方法将回调处理,推到一个队列里。如果在回调里请求是正确的,返回了HTTP,那么会运行then,如果HTTP请求出错,则会运行catch。但是发完请求之后还是会继续向下执行,对所有的返回结果的处理还是要到then里执行,而上图中的代码是没办法依赖then里的返回结果的,因为不知道什么时候才会执行完成,所以会出现异步的传染性问题,一旦使用回调或promise的方式,能处理异步的方法就变得局限了,只能在then或catch里处理回调的过程。

17f8f6b32ec3eae06d4a6273b9836d8f.png

那么使用async/await + Promise来控制异步会产生什么效果,如上图所示。首先是一个request请求,然后在函数上标记一个async方法,它依然会发起一个fetch请求,与上述唯一不同的是在fetch前加了一个await,这样,在fetch里无论是成功还是失败,总可以得到一个值,这个值会存到result里,当result有值时才会执行。这种方式即处理了异步又可以阻塞上面的流程。但还是会出现异步的传染性问题,await不能用在JS脚本的全局中。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值