同步和异步的区别与Promise使用场景

Javascript的单线程指的是在JS执行环境中负责执行代码的线程只有一个,这种更安全更简单,但缺点也同样很明显,如果遇到一个特别耗时的任务,那后面的任务都必须去排队等待这个任务的结束,会导致整个运行被拖延,出现假死的情况,为了解决这个问题,javascript将任务的执行模式分成了两种,分别是同步模式(Synchronous)和异步模式(Asynchronous)

同步模式

执行的时候压入调用盏中,会记录当前正在执行的任务,执行完从盏中消失,当有一个任务耗时很长时,后面的任务容易阻塞。单线程的javascript语言无法同时处理大量耗时的任务

异步模式

异步模式不会去等待这个任务的结束才开始下一个任务,对于耗时的任务,都是开启过后就立即往后执行下一个任务,后续的逻辑一般会通过回调函数的方式定义,在这个耗时任务完成过后就会自动执行回调函数。

javascript是单线程的,但浏览器不是单线程的,通过调 用javascript的某些api并不是单线程的,例如倒计时器,它内部有一个单独的线程去负责倒数,时间到了过后会将回调放入到消息队列,也就是说这样的一件事情是有一个单独的线程去做的。我们说的单线程是指执行的代码的线程。而运行的环境提供的API是以同步或异步模式的方式工作。

实现异步的方法

实现异步的方法目前有,自定义嵌套,Promise、generator、Defferd,还有ES7的async(其实是generator的封装),不同场景可以选择不同的方式去实现


什么是 Promise

promise的定义

先给下Promise学术点的描述:
promise代表一个异步操作的执行返回状态,这个执行返回状态在promise对象创建时未必已知。它允许你为异步操作的成功或失败指定处理方法。

扫描二维码关注公众号,回复: 12863939 查看本文章

promise的用途

Promise可以用来避免异步操作函数里的嵌套回调(callback hell)问题,因为解决异步最直接的方法是回调嵌套,将后一个的操作放在前一个操作的异步回调里,但如果操作多了,就会有很多层的嵌套。

promise的知识点

1.Promise实例的then方法作用是为Promise实例添加状态改变时的回调函数。then方法的第一个参数是resolved状态的回调函数,第二个参数是rejected状态的回调函数。

2.then方法返回的是一个新的Promise实例,(注意:不是原来那个Promise实例)。因此可以采用链式写法。

3.Promise对象的错误具有“冒泡”性质,会一直向后传递,直到被捕获为止。即错误总会被下一个catch语句捕获。

4.一般,不要在then 方法中定义rejected状态的回调函数(即then的第二个参数),而应总是使用catch方法。因为catch更接近同步写法。

5.catch方法返回的还是一个Promise对象,可接着调用then方法。

6.在 JavaScript 函数中,只有 return / yield / throw 会中断函数的执行,其他的都无法阻止其运行到结束的,这也是所谓的Run-to-completion 特性。

promise的优点

  1. Promise 的一大优点,就是结果不变性,一旦 Promise 的值确定为fulfilled 或者 rejected 后,无论过多久,获取到的 Promise 对象的值都是一样的。

对不变性的理解:

像 resolve/reject 不过只是一个回调而已,而所谓的不变性只是说,当遇到第一个 resolve/reject 后,便根据其结果给此 Promise 打上了一个 tag,并且不能更改,而后面的该干啥继续干,不干本 Promise 的事儿了。

使用promise注意事项

1.始终在Promise 构造器中书写逻辑的话,即使出现了意外的输入,也能绝大部分情况下返回一个Rejected 的 Promise

2.在 Promise 构造器中,除非你明确知道使用 throw 的正确姿势,否则都请使用 reject。

3。能够兼容 Promise 和 Callback 确实是件很棒的事情,用第三方代码前请尽量理解其原理,短小的话完全可以自己写一个。Promise虽好,可不要乱用哦,实时牢记它会吞没错误的风险。

猜你喜欢

转载自blog.csdn.net/weixin_53687450/article/details/114991516