关于Promise!你都搞懂了吗?

Promise简单来讲就是一个容器,保存着某个将来才会结束得事件(一般为异步操做)得结果。从语法上来说,Promise是一个对象,能够获取异步操做得消息;Promise提供了统一 得API,各类异步操做均可以用一样得方法进行处理。复制代码

一、 Promise对象有两大特色:数组

1)对象得状态不受外界得影响。Promise对象表明一个异步操做。有三种状态:pending(进行中)、fulfilled(已成功)和rejected(已失败)。只有异步操做的结果,能够决定当前是哪种状态,任何其余操做都没法改变这个状态。
2)一旦状态改变,就不会再变,任什么时候候均可以获得这个结果。 Promise 对象的状态改变,只有两种可能:从 pending 变为 fulfilled 和从 pending 变为 rejected 。只要这两种状况发生,状态就凝固了,不会再变了,会一直保持这个结果,这时就称为 resolved(已定型)。若是改变已经发生了,你再对 Promise 对象添加回调函数,也会当即获得这个结果。这与事件(Event)彻底不一样,事件的特色是,若是你错过了它,再去监听,是得不到结果的。复制代码

2.Promise得缺点:promise

1)没法取消 Promise ,一旦新建它就会当即执行,没法中途取消;
2)若是不设置回调函数, Promise 内部抛出的错误,不会反应到外部。
3)当处于 pending 状态时,没法得知目前进展到哪个阶段(刚刚开始仍是即将完成)。复制代码

3.Promise用法:异步

1)Promise对象是一个构造函数,用来生成Promise实例;ide

const KKBpromise = new Promise(function(resolve, reject) {
  // ... some code

  if (/* 异步操做成功 */){
    resolve(value);
  } else {
    reject(error);
  }
});复制代码

Promise 构造函数接受一个函数做为参数,该函数的两个参数分别是resolve 和reject 。它们是两个函数,由 JavaScript 引擎提供,不用本身部署。函数

resolve 函数的做用是,将 Promise对象的状态从“未完成”变为“成功”(即从 pending 变为 resolved),在异步操做成功时调用,并将异步操做的结果,做为参数传递出去;reject函数的做用是,将 Promise对象的状态从“未完成”变为“失败”(即从 pending 变为 rejected),在异步操做失败时调用,并将异步操做报出的错误,做为参数传递出去.code

Promise 实例生成之后,能够用 then方法分别指定resolved状态和 rejected状态的回调函数。 举个栗子:对象

KKBpromise.then(function(value) {
  // success
}, function(error) {
  // failure
});复制代码

then 方法能够接受两个回调函数做为参数。第一个回调函数是Promise对象的状态变为 resolved时调用,第二个回调函数是 Promise对象的状态变为rejected时调用。其中,第二个函数是可选的,不必定要提供。这两个函数都接受 Promise 对象传出的值做为参数。事件

function pros(ms) {
  return new Promise((resolve, reject) => {
    setTimeout(resolve, ms, 'done');
  });
}
pros(100).then((value) => {
  console.log(value);
});复制代码

pros 方法返回一个 Promise 实例,表示一段时间之后才会发生的结果。过了指定的时间( ms 参数)之后, Promise 实例的状态变为 resolved ,就会触发 then 方法绑定的回调函数。ip

2)Promise新建后会当即执行。 举例说明:部署

let promise = new Promise(function(resolve, reject) {
  console.log('Pro');
  resolve();
});
promise.then(function() {
  console.log('resolved');
});
console.log('Hello Promise!');
// Pro
// Hello Promise!
// resolved复制代码

Promise 新建后当即执行,因此首先输出的是 Promise 。而后, then 方法指定的回调函数,将在当前脚本全部同步任务执行完才会执行,因此 resolved 最后输出。

有时候在调用 resolve 或 reject 之后,Promise 的使命就完成了,后继操做应该放到 then 方法里面,而不该该直接写在 resolve 或 reject 的后面。因此,最好在它们前面加上 return 语句,这样就不会有意外。

new Promise((resolve, reject) => {
  return resolve(1);
  // 后面的语句不会执行
  console.log('接着执行');
})复制代码

4.Promise经常使用得API:

1)Promise.all()这个方法返回一个新的promise对象,该promise对象在全部的promise对象都成功的时候才会触发成功,一旦有任何一个里面的promise对象失败则当即触发该promise对象的失败。这个新的promise对象在触发成功状态之后,会把一个包含全部promise返回值的数组做为成功回调的返回值,顺序跟参数的顺序保持一致;若是这个新的promise对象触发了失败状态,它会把第一个触发失败的promise对象的错误信息做为它的失败错误信息。Promise.all方法常被用于处理多个promise对象的状态集合。

let kkb1 = new Promise((resolve, reject) => {
 resolve('成功了kkb1')
})

let kkb2 = new Promise((resolve, reject) => {
 resolve('成功了kkb2')
})

let kkb3 = Promse.reject('失败')


Promise.all([kkb1, kkb2])
 .then((result) => {
   console.log(result) //['成功了kkb1', '成功了kkb2']
 })
 .catch((error) => {
   console.log(error)
 })


Promise.all([kkb1,kkb3,kkb2])
 .then((result) => {
   console.log(result)
 })
 .catch((error) => {
   console.log(error) //  '失败'
 })复制代码

2)Promise.race的使用 race和all用法相似。Promse.race方法顾名思义就是赛跑的意思,意思就是说Promise.race([kkb1, kkb2, kkb3])里面哪一个结果得到的快,就返回那个结果,无论结果自己是成功状态仍是失败状态。

let kkb1 = new Promise((resolve, reject) => {
  setTimeout(() => {
    resolve('kkb1')
  },1000)
})
 
let kkb2 = new Promise((resolve, reject) => {
  setTimeout(() => {
    reject('kkb2')
  }, 500)
})
 
 
Promise.race([kkb1, kb2])
  .then((result) => {
    console.log(result)
  }).catch((error) => {
    console.log(error)  //  打印出kkb2 由于它快
  })复制代码
相关文章
相关标签/搜索