1,Promise初步介绍

Promise 是异步编程的一种解决方案,其实是一个构造函数

自己身上有all、reject、resolve这几个方法,原型上有then、catch等方法

什么是原型:https://blog.csdn.net/qq_34645412/article/details/105997336

涉及到JavaScript高级

promises 的概念是由 CommonJS 小组的成员在 Promises/A 规范中提出来的。

Promise,他是一个对象,是用来处理异步操作的,可以让我们写异步调用的时候写起来更加优雅,更加美观便于阅读。

顾名思义为承诺、许诺的意思,意思是使用了Promise之后他肯定会给我们答复,无论成功或者失败都会给我们一个答复,所以我们就不用担心他跑了哈哈。

2,then()方法介绍

根据 Promise/A 规范,promise 是一个对象,只需要 then 这一个方法。then 方法带有如下三个参数:

成功回调

失败回调

前进回调(规范没有要求包括前进回调的实现,但是很多都实现了)。

一个全新的 promise 对象从每个 then 的调用中返回。

3,Promise对象状态

Promise 对象代表一个异步操作,其不受外界影响,有三种状态:

Pending(进行中、未完成的)

Resolved(已完成,又称 Fulfilled)

Rejected(已失败)

(1)promise 从未完成的状态开始,如果成功它将会是完成态,如果失败将会是失败态。

(2)当一个 promise 移动到完成态,所有注册到它的成功回调将被调用,而且会将成功的结果值传给它。另外,任何注册到 promise 的成功回调,将会在它已经完成以后立即被调用。

(3)同样的,当一个 promise 移动到失败态的时候,它调用的是失败回调而不是成功回调。

(4)对包含前进特性的实现来说,promise 在它离开未完成状态以前的任何时刻,都可以更新它的 progress。当 progress 被更新,所有的前进回调(progress callbacks)会被传递以 progress 的值,并被立即调用。前进回调被以不同于成功和失败回调的方式处理;如果你在一个 progress 更新已经发生以后注册了一个前进回调,新的前进回调只会在它被注册以后被已更新的 progress 调用。

(5)注意:只有异步操作的结果,可以决定当前是哪一种状态,任何其他操作都无法改变这个状态。

4,Promise具体介绍

promise是新的技术(ES6)

promise可以封装一个异步操作从而获取成功值或失败值:FS文件操作,数据库操作,AJAX网络请求,定时器

5,Promise具体使用

  1. <div onClick={promiseClick}>开始异步请求</div>
  2. const promiseClick = ( ) => {
  3. console.log('点击方法被调用')
  4. let p = new Promise(function(resolve, reject){
  5. //做一些异步操作
  6. setTimeout(function(){
  7. console.log('执行完成Promise');
  8. resolve('要返回的数据可以任何数据例如接口返回数据');
  9. }, 2000);
  10. });
  11. return p
  12. }

当放在函数里面的时候只有调用的时候才会被执行

那么,接下里解决两个问题:

1、为什么要放在函数里面

2、resolve是个什么鬼?

我们包装好的函数最后,会return出Promise对象,也就是说,执行这个函数我们得到了一个Promise对象。接下来就可以用Promise对象上有then、catch方法了,这就是Promise的强大之处了,看下面的代码:

  1. promiseClick().then(function(data){
  2. console.log(data);
  3. //后面可以用传过来的数据做些其他操作
  4. //......
  5. });

先是方法被调用起床执行了promise,最后执行了promise的then方法,then方法是一个函数,接受一个参数,是接受resolve返回的数据,就输出了‘要返回的数据,可以任何数据,例如接口返回数据’

这时候你应该有所领悟了,原来then里面的函数就跟我们平时的回调函数一个意思,能够在promiseClick这个异步任务执行完成之后被执行。这就是Promise的作用了,简单来讲,就是能把原来的回调写法分离出来,在异步操作执行完后,用链式调用的方式执行回调函数。

你可能会觉得在这个和写一个回调函数没有什么区别;那么,如果有多层回调该怎么办?如果callback也是一个异步操作,而且执行完后也需要有相应的回调函数,该怎么办呢?总不能再定义一个callback2,然后给callback传进去吧。而Promise的优势在于,可以在then方法中继续写Promise对象并返回,然后继续调用then来进行回调操作。

所以:精髓在于:Promise只是能够简化层层回调的写法,而实质上,Promise的精髓是“状态”,用维护状态、传递状态的方式来使得回调函数能够及时调用,它比传递callback函数要简单、灵活的多。所以使用Promise的正确场景是这样的:

  1. promiseClick()
  2. .then(function(data){
  3. console.log(data);
  4. return runAsync2();
  5. })
  6. .then(function(data){
  7. console.log(data);
  8. return runAsync3();
  9. })
  10. .then(function(data){
  11. console.log(data);
  12. });