zoukankan      html  css  js  c++  java
  • 对Promise中的resolve,reject,catch的理解

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

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

    一   Promise 对象的含义?

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

    它的一般表示形式为:

     1 new Promise(
     2     /* executor */
     3     function(resolve, reject) {
     4         if (/* success */) {
     5             // ...执行代码
     6             resolve();
     7         } else { /* fail */
     8             // ...执行代码
     9             reject();
    10         }
    11     }
    12 );
    View Code

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

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

    1.pending

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

    2.fulfilled

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

    3.rejected

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

    二  .then()的时候到底是在then什么?

    • 首先要理解Promise是一个对象,有then()方法的对象
    • then()的参数是一个函数 (通常在promise链中,参数是一个返回promise的函数 ,这个函数会return一个promise对象)

    三  如何破坏promise链?

    如果有这样一个promise链:

     1 p1().then(p2).then(p3)
     2   .then(function(data) {
     3     console.log('data: ' + data);
     4   })
     5   .catch(function(error) {
     6     console.log('error: ' + error);
     7   });
     8  
     9 function p1() {
    10   return new Promise(function(resolve, reject) {
    11     console.log('p1 resolved');
    12     resolve(123);
    13   });
    14 }
    15  
    16 function p2() {
    17   return new Promise(function(resolve, reject) {
    18     console.log('p2 rejected');
    19     reject(456);
    20   });
    21 }
    22  
    23 function p3() {
    24   return new Promise(function(resolve, reject) {
    25     console.log('p3 resolved');
    26     resolve(789);
    27   });
    28 }
    View Code

    上面这个例子,console.log结果会是这样:

    1 p1 resolved
    2 p2 rejected
    3 error: 456
    View Code

    总之 : 在一个promise链中,只要任何一个promise被reject,promise链就被破坏了,reject之后的promise都不会再执行,而是直接调用.catch方法。

    这也是为什么在standard practice中,一定要在最后加上 .catch 的原因。通过 .catch 能够清楚的判断出promise链在哪个环节出了问题。

  • 相关阅读:
    最能激怒程序猿的十句话()
    程序员是如何被外行给逼疯的?
    Linux 平台安装Oracle Database 12c
    替代恐慌你有吗?程序员会被深度学习技术淘汰吗?
    1006 换个格式输出整数 (15 分)C语言
    1021 个位数统计 (15 分)C语言
    1010 一元多项式求导 (25 分)C语言
    1009 说反话 (20 分)C语言
    1008 数组元素循环右移问题 (20 分)C语言
    1056 组合数的和 (15 分)C语言
  • 原文地址:https://www.cnblogs.com/opensars/p/9437332.html
Copyright © 2011-2022 走看看