小白的学习日记(回调地狱)

js中的回调地狱

什么是回调地狱

要想了解回调地狱,首先要理解异步和同步操作操作。
同步指的是一次只能完成一件任务。如果有多个任务,就必须排队,前面一个任务完成,再执行后面一个任务,以此类推。

异步指的是每一个任务有一个或多个回调函数,前一个任务结束后,不是执行后一个任务,而是执行回调函数,后一个任务则是不等前一个任务结束就执行,所以程序的执行顺序与任务的排列顺序是不一致的、异步的。
在异步操作中,由于操作系统分片工作机制,多个文件的输出顺序是不确定的,后执行的可能会先输出。若要保证输出顺序,在前一个异步操作的回调函数中调用后一个异步操作。异步操作越多,这种嵌套的层级也就越复杂,不利于代码维护。这就造成了回调地狱。

解决的三种方法

1.promise
异步操作中的各个函数顺序是乱的,promie就是给这些函数排个序,然后用then语句调出来,这样我们调用函数就很方便不会乱套。
Promise对象有以下两个特点。
(1)对象的状态不受外界影响
三种状态:pending(进行中)、fulfilled(已成功)和rejected(已失败)
(2)一旦状态改变,就不会再变,任何时候都可以得到这个结果
Promise对象的状态改变,只有两种可能:从pending变为fulfilled和从pending变为rejected。
2.generator
在函数方法名前面加一个 * 这个函数就是一个生成器函数,简单点说yield类似return 也是返回值的,区别在于当程序执行到yield后会返回yield后面的表达式,并且程序暂停在这里保存当前值状态,程序只是暂停在这里并没有中止。
使用next()方法可以获取到yield第一次暂停的值,value表示yield返回的值,done表示是否迭代完毕。当然也可以直接使用netx()的括号来给yield设置下次执行的值。
“协程”:
传统的编程语言,早有异步编程的解决方案(其实是多任务的解决方案)。其中有一种叫做"协程"(coroutine),意思是多个线程互相协作,完成异步任务。
协程有点像函数,又有点像线程。它的运行流程大致如下。
第一步,协程A开始执行。
第二步,协程A执行到一半,进入暂停,执行权转移到协程B。
第三步,(一段时间后)协程B交还执行权。
第四步,协程A恢复执行。
yield命令是异步两个阶段的分界线。
协程遇到yield命令就暂停,等到执行权返回,再从暂停的地方继续往后执行。它的最大优点,就是代码的写法非常像同步操作,如果去除yield命令,简直一模一样
Generator 函数可以暂停执行和恢复执行,这是它能封装异步任务的根本原因。除此之外,它还有两个特性,使它可以作为异步编程的完整解决方案:函数体内外的数据交换和错误处理机制。
3.async/await:
使用方法和generator差不多,其中*用async代替,yield用await代替

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值