美文网首页
Es6 promise用法

Es6 promise用法

作者: 却忘不掉你心言 | 来源:发表于2018-07-02 21:53 被阅读0次

Node的产生,大大推动了Javascript这门语言在服务端的发展,使得前端人员可以以很低的门槛转向后端开发。

想必接触过Node的人都知道,Node是以异步(Async)回调著称的,其异步性提高了程序的执行效率,但同时也减少了程序的可读性。如果我们有几个异步操作,并且后一个操作需要前一个操作返回的数据才能执行,这样按照Node的一般执行规律,要实现有序的异步操作,通常是一层加一层嵌套下去。

为了解决这个问题,ES6提出了Promise的实现。

含义:


Promise 对象用于一个异步操作的最终完成(或失败)及其结果值的表示。简单点说,它就是用于处理异步操作的,异步处理成功了就执行成功的操作,异步处理失败了就捕获错误或者停止后续操作。

它的一般表示形式为:

newPromise(

/* executor */function(resolve, reject){

if(/* success */) {

// ...执行代码resolve();       

 }else{/* fail *

/// ...执行代码reject();  

      } 

   });

其中,Promise中的参数executor是一个执行器函数,它有两个参数resolve和reject。它内部通常有一些异步操作,如果异步操作成功,则可以调用resolve()来将该实例的状态置为fulfilled,即已完成的,如果一旦失败,可以调用reject()来将该实例的状态置为rejected,即失败的。

我们可以把Promise对象看成是一条工厂的流水线,对于流水线来说,从它的工作职能上看,它只有三种状态,一个是初始状态(刚开机的时候),一个是加工产品成功,一个是加工产品失败(出现了某些故障)。同样对于Promise对象来说,它也有三种状态:

pending

初始状态,也称为未定状态,就是初始化Promise时,调用executor执行器函数后的状态。

fulfilled

完成状态,意味着异步操作成功。

rejected

失败状态,意味着异步操作失败。

它只有两种状态可以转化,即

操作成功

pending -> fulfilled

操作失败

pending -> rejected

并且这个状态转化是单向的,不可逆转,已经确定的状态(fulfilled/rejected)无法转回初始状态(pending)。

方法


Promise.prototype.then()

Promise对象含有then方法,then()调用后返回一个Promise对象,意味着实例化后的Promise对象可以进行链式调用,而且这个then()方法可以接收两个函数,一个是处理成功后的函数,一个是处理错误结果的函数。

var promise1 = new Promise(function(resolve, reject) {

  // 2秒后置为接收状态

  setTimeout(function() {

    resolve('success');

  }, 2000);

});

promise1.then(function(data) {

  console.log(data); // success

}, function(err) {

  console.log(err); // 不执行

}).then(function(data) {

  // 上一步的then()方法没有返回值

  console.log('链式调用:' + data); // 链式调用:undefined

}).then(function(data) {

  // ....

});

在这里我们主要关注promise1.then()方法调用后返回的Promise对象的状态,是pending还是fulfilled,或者是rejected?

返回的这个Promise对象的状态主要是根据promise1.then()方法返回的值,大致分为以下几种情况:

如果then()方法中返回了一个参数值,那么返回的Promise将会变成接收状态。

如果then()方法中抛出了一个异常,那么返回的Promise将会变成拒绝状态。

如果then()方法调用resolve()方法,那么返回的Promise将会变成接收状态。

如果then()方法调用reject()方法,那么返回的Promise将会变成拒绝状态。

如果then()方法返回了一个未知状态(pending)的Promise新实例,那么返回的新Promise就是未知状态。

如果then()方法没有明确指定的resolve(data)/reject(data)/return data时,那么返回的新Promise就是接收状态,可以一层一层地往下传递。

var promise2 = new Promise(function(resolve, reject) {

  // 2秒后置为接收状态

  setTimeout(function() {

    resolve('success');

  }, 2000);

});

promise2

  .then(function(data) {

    // 上一个then()调用了resolve,置为fulfilled态

    console.log('第一个then');

    console.log(data);

    return '2';

  })

  .then(function(data) {

    // 此时这里的状态也是fulfilled, 因为上一步返回了2

    console.log('第二个then');

    console.log(data);  // 2

    return new Promise(function(resolve, reject) {

      reject('把状态置为rejected error'); // 返回一个rejected的Promise实例

    });

  }, function(err) {

    // error

  })

  .then(function(data) {

    /* 这里不运行 */

    console.log('第三个then');

    console.log(data);

    // ....

  }, function(err) {

    // error回调

    // 此时这里的状态也是fulfilled, 因为上一步使用了reject()来返回值

    console.log('出错:' + err); // 出错:把状态置为rejected error

  })

  .then(function(data) {

    // 没有明确指定返回值,默认返回fulfilled

    console.log('这里是fulfilled态');

});

Promise.prototype.catch()

catch()方法和then()方法一样,都会返回一个新的Promise对象,它主要用于捕获异步操作时出现的异常。因此,我们通常省略then()方法的第二个参数,把错误处理控制权转交给其后面的catch()函数,如下:

var promise3 = new Promise(function(resolve, reject) {

  setTimeout(function() {

    reject('reject');

  }, 2000);

});

promise3.then(function(data) {

  console.log('这里是fulfilled状态'); // 这里不会触发

  // ...

}).catch(function(err) {

  // 最后的catch()方法可以捕获在这一条Promise链上的异常

  console.log('出错:' + err); // 出错:reject

});

相关文章

  • ES6 标准

    ES6 Promise 用法(我见过最简洁优秀的文章)

  • ES6 Promise 用法讲解

    ES6 Promise 用法讲解 Promise是一个构造函数,自己身上有all、reject、resolve这几...

  • ES6 Promise 用法讲解

    ES6 Promise 用法讲解 Promise是一个构造函数,自己身上有all、reject、resolve这几...

  • Promise 对象

    一、Promise的含义 Promise在JavaScript语言中早有实现,ES6将其写进了语言标准,统一了用法...

  • Promise

    Promise Promise 是异步编程的一种解决方案,es6中统一器用法,原生提供了promise对象 Pro...

  • promise对象

    1、基本用法 ES6 规定,Promise对象是一个构造函数,用来生成Promise实例。 下面代码创造了一个Pr...

  • es6Promise学习笔记

    Promise 是异步编程的一种解决方案,ES6 将其写进了语言标准,统一了用法,原生提供了Promise对象。有...

  • <转载>es6 Promise

    ES6 Promise用法讲解 所谓Promise,简单说就是一个容器,里面保存着某个未来才会结束的事件(通常是一...

  • Es6 promise用法

    Node的产生,大大推动了Javascript这门语言在服务端的发展,使得前端人员可以以很低的门槛转向后端开发。 ...

  • es6 Promise用法

    Promise是一个异步操作,分为三种状态:Pending(进行中)、Resolved(已完成,又称 Fulfil...

网友评论

      本文标题:Es6 promise用法

      本文链接:https://www.haomeiwen.com/subject/pgrruftx.html