对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 );

其中,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 }

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

1 p1 resolved
2 p2 rejected
3 error: 456

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

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

原文地址:https://www.cnblogs.com/tanziyi-666/p/9437332.html

时间: 2024-10-08 14:33:42

对Promise中的resolve,reject,catch的理解的相关文章

[js高手之路] es6系列教程 - promise常见用法详解(resolve,reject,catch,then,all,race)

关于promise我在之前的文章已经应用过好几次,如[js高手之路]Node.js+jade+express+mongodb+mongoose+promise实现todolist,本文就来讲解下promise的常见用法. 为什么会有promise,他的作用是什么? promise主要是为了解决js中多个异步回调难以维护和控制的问题. 什么是promise? 从图中,我们可以看出,Promise是一个函数,这个函数上有在项目中常用的静态方法:all, race, reject,resolve等,原

es6中promise ALL Race Resolve Reject finish的实现

function mypromise(func){ this.statue = "pending"; this.data = null; this.resolveCallback = []; this.rejectCallback = []; this._final = null; var self = this; var resolve = function(data){ if (data instanceof mypromise) { data.then(resolve,rejec

Promise对象的resolve回调函数和reject回调函数使用

Promise是ES6中用来结局回调地狱的问题的但是并不能帮我们减少代码量 Promise是一个构造函数 new Promise() 得到一个Promise一个实例 在Promise上有两个函数分别是resolve(成功之后的回调函数)和reject(失败之后的回调函数) 在Promise构造函数的prototype属性上,有一个.then()方法,也就是只要是Promise构造函数创建的实例,都可以访问到.then()方法 如果Promise表示一个异步操作,每当我们new一个Promise的

重读es6, 正确了解promise中catch的用法

前言 在最近的项目中,用到了es6的promise语法,发现promise.prototype.catch 并不只是单单reject抛出的回调函数,所以今天做一些笔录,防止以后在项目中又碰到这样的问题. 先介绍一下promise.prototype.catch Promise.prototype.catch 方法是 .then(null, rejection) 或是 .then(undefined, rejection)的别名,用于指定发生错误时的回调函数. 如果Promise 对象状态变为re

Promise中的then第二个参数和catch有什么区别?

Promise中的then第二个参数和catch有什么区别? 首页我们先要区分几个概念,第一,reject是用来抛出异常的,catch是用来处理异常的: 第二:reject是Promise的方法,而then和catch是Promise实例的方法(Promise.prototype.then 和 Promise.prototype.catch). 1. 区别 主要区别就是,如果在then的第一个函数里抛出了异常,后面的catch能捕获到,而then的第二个函数捕获不到. catch只是一个语法糖而

在ios开发中使用 try 和 catch 来捕获错误。

本文转载至 http://blog.csdn.net/remote_roamer/article/details/7105776 抛出错误的代码 [cpp] view plaincopy //如果返回的报文是错误信息,则抛出错误 if([outParams count] <= 0) { [NSException raise:@"WebService error" format:@"%@", returnJson4SOAP]; } 在调用中捕获错误代码 [cpp

Java中的try、catch、finally块简单的解析

package com.wangzhu; import java.util.HashMap; import java.util.Map; /** * 在try.catch.finally块中,若try中有return语句,则返回try中变量的值,<br/> * 不管try块外是否对该变量进行了修改, 都不影响try中return的返回值.<br/> * 若finally中有return语句,则忽略try.catch块中的return语句.<br/> * 若finally

事务场景中,抛出异常被catch后,如果需要回滚,一定要手动回滚事务

Spring使用声明式事务处理,默认情况下,如果被注解的数据库操作方法中发生了unchecked异常,所有的数据库操作将rollback:如果发生的异常是checked异常,默认情况下数据库操作还是会提交的. checked异常: 表示无效,不是程序中可以预测的.比如无效的用户输入,文件不存在,网络或者数据库链接错误.这些都是外在的原因,都不是程序内部可以控制的.必须在代码中显式地处理.比如try-catch块处理,或者给所在的方法加上throws说明,将异常抛到调用栈的上一层. 阿里编码规约示

C++中的try throw catch 异常处理

今天在开发过程中调用一个库函数结果库函数有throw操作,当前代码没有对throw进行捕获操作,导致进程在main 函数中捕获到异常导致进程crash.所以借此记录下c++关于try,throw,catch的用法. 程序运行时常会碰到一些异常情况,例如: 做除法的时候除数为 0: 用户输入年龄时输入了一个负数: 用 new 运算符动态分配空间时,空间不够导致无法分配: 访问数组元素时,下标越界:打开文件读取时,文件不存在. 这些异常情况,如果不能发现并加以处理,很可能会导致程序崩溃. 所谓“处理