[ ES6 ] 进阶篇(一) —— Promise

Promise 是异步编程的一种解决方案,比传统的解决方案——回调函数和事宜——更合理和更壮大。

什么是 Promise

从运用上来说是一种语法糖,会了今后写东西简朴一些
Promise 翻译过来就是 许诺 信誉 商定 准许 的意义
那末我是否是能够理解为它准许我会去做某件事,或许约好了会做某事
注:示例代码部份运用 jquery 示例

特性

  • 对象的状况不受外界影响

promise 有三个状况:待定(pending),推行(fulfilled),谢绝(rejected)。只需返回的效果能够影响状况,其他任何操纵不会影响到这个状况。

//待定:初始状况,既未推行也未谢绝。
//推行:意味着操纵胜利完成。
//谢绝:意味着操纵失利。

就像约会,说好了要约会,恪守了商定,有其他缘由谢绝了商定。只需约会这件事中的相互才决议是恪守照样谢绝,其他人是决议不了的。

  • 状况只会转变一次

Promise对象的状况转变,只需两种能够:胜利(fulfilled)和失利(rejected);只需转变了就会一直是这个效果。

照样约会,到了约会的时刻以后效果就是一定的了。他人第二天问起昨天约会去了吗?也只会回复去了;或许没去。是不能够说第一次回复去了,第二次回复没去,第三次回复去了又没去。

  • 新建 promise 就会马上实行,没法半途作废。
  • 假如不设置回调函数,Promise内部抛出的毛病,不会回响反映到外部
  • 当处于pending状况时,没法得知现在希望到哪个阶段(刚刚开始照样行将完成)。

参数

Promise有两个参数名须要通报 resolve 和 reject ;离别用来返回胜利和失利,他们是两个函数,只须要末了挪用一下就行,不必本身去做操纵

const promise = new Promise((resolve, reject) => {//约会定在下昼2点
  // 为约会做准备

  if (/*到时刻了*/){
    resolve(value);//都来了 恪守了商定
  } else {
    reject(error);//有事来不了了 谢绝了商定
  }
});

要领

Promise 原型要领

//原型要领运用要领
Promise.prototype.then();
//现实用的时刻直接在 Promise 对象后运用要领的即可
let p = new Promise();
P.then();

then() //以后

它的参数是回调函数,能够有两个
第一个必填,示意胜利了会实行的操纵;第二个能够不填,示意失利了会实行的操纵(引荐至少有一个吸收毛病的要领被挪用)

const promise = new Promise((resolve, reject) => {//约会定在下昼2点;新建 Promise 对象
  // 为约会做准备;要求数据

  if (/*到时刻了*/){
    resolve(value);//都来了 恪守了商定;返回胜利后的值
  } else {
    reject(error);//有事来不了了 谢绝了商定;返回失利的缘由
  }
});
promise.then( value => {
  //恪守了商定,两个人能够一同做点什么;数据操纵
}, error => {
  //谢绝了商定,本身一个人做点什么;显现毛病信息或许重试
});

catch() //捕捉

它的参数是一个回调函数,示意失利了会实行的操纵(引荐运用 catch() 吸收毛病)

promise.catch( error => {
  //显现毛病信息或许重试
});

finally() //末了

它的参数是一个回调函数,示意不管是推行了商定照样谢绝了商定 末了都邑实行的操纵

promise.finally( () => {
  //实行完 Promise 后实行的操纵
});

Promise 对象要领

//直接运用 Promise 关键字就能够挪用要领
Promise.all();

all()

参数是 Promise 对象数组或许数组元素返回的都是 Promise 对象
当一切的 Promise 对象全都返回胜利时,才会将一切胜利的返回值通报给 then()
有一个返回失利就会直接完毕当前 Promise ,并将第一个失利的返回值通报给 cath()

假如说有一系列数据要猎取这时候就能够用 Promise.all()

//猎取 直接用 $.ajax() 是因为 $.ajax() 现实上返回的是 Promise 对象
Promise.all([
    $.ajax({url:'api/userInfo'}),
    $.ajax({url:'api/banner'}),
    $.ajax({url:'api/imagesUrl'})
]).then(arr=>{//悉数胜利才会挪用
    let [userInfo1,userInfo2,userInfo3] = arr;
    console.log(userInfo1,userInfo2,userInfo3);
}).catch(err=>{//有一个失利就停止并挪用
    console.log(err);
});

reace()

参数是 Promise 对象数组或许数组元素返回的都是 Promise 对象
只需有一个返回了状况不论是胜利或失利都邑将值通报给 then()

这篇文章主如果本身用来疾速查阅 Promise 相干语法的,关于看文档难题的不引荐看

    原文作者:yhtx1997
    原文地址: https://segmentfault.com/a/1190000017523099
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞