JS异步之Promise基础

  • 首先,Promise并不是发源于javascript,它最早被提出于E语言中.
  • 那到底什么是Promise,它是抽象异步处理对象以及对其进行各种操作的组件,JS中Promise的出现,很大程度上降低了异步编程的复杂性.

处理js中的异步,我用得最多的就是回调函数,那么Promise和回调函数在处理异步问题时的异同点是什么,又是如何使用的呢?带着这些问题,我们一起来学习Promise

Promise特点

  • 在回调函数中,通常我们的第一个参数都是ERROR对象,但这只是一种惯例,并未规范化,即就是不这样写也不会出错
  • 但在Promise中 则是把类似的异步处理对象和处理规则进行规范化, 并按照采用统一的接口来编写,而采取规定方法之外的写法都会出错,对应其处理结果Promise都提供了统一的接口then(),以及对应的异常处理接口catch().

基于 Promise 的统一接口的做法, 就可以形成基于接口的各种各样的异步处理模式。所以,promise 的功能是可以将复杂的异步处理轻松地进行模式化.

Promise API

大致分为三种类型

  • Constructor

Promise是一个构造函数,我们可以通过该构造函数来创建一个新的Promise对象,具体是通过new方法来调用该构造函数

let p1 = new Promise(function(resolve,reject){
//异步处理
//调用resolve或者reject方法来处理异步结果
})
  • Instance Method

通过new Promise 得到的Promise对象,需要设置在异步处理成功或者失败时所要调用的回调函数,它有两个方法,then()catch()

then():promise.then(onFulfilled, onRejected)
onFulfilledonRejected分别是异步处理成功和失败时所要调用的两个函数,且都是可选的
若只处理成功时的结果:promise.then(onFulfilled)
若只处理失败时的结果:promise.then(undefined, onRejected)
但后者还有一个更好的选择,就是catch(): promise.catch(onRejected)

  • Static Method

Promise全局对象还有几个静态方法
Promise.all(iterable):返回所有成功的Promise对象或者某一个失败的Promise对象
Promise.race(iterable):返回一个成功或者失败的Promise对象,以先发生者为准
Promise.resolve(value):返回指定结果的Promise对象
Promise.reject(reason):返回一个Promise 对象,并且指定了失败原因

function asyncFunction() {

        return new Promise(function (resolve, reject) {
            setTimeout(function () {
                resolve('Async Hello world');
            }, 16);
        });
    }

 asyncFunction().then(function (value) {
        console.log(value);    // => 'Async Hello world'
    }).catch(function (error) {
        console.log(error);
    });
//上面的代码中对异常处理用了catch(),当然也可以只用then()
asyncFunction().then(function (value) {
        console.log(value);    // => 'Async Hello world'
    },function(err){
      console.log(err);
   });

Promise State

new Promise()得到的对象,有三种状态,pending,resolve和reject
pending:既不是 resolve 也不是 reject 的状态。也就是 promise 对象刚被创建后的初始化状态等
resolve:成功状态,此时会调用onFulfilled
reject:失败状态,此时会调用onRejected

三种状态的转换关系如下:


状态转换图

未完~

推荐阅读更多精彩内容