Promise详解(一)——Promise学习笔记
初识Promise
含义
可以理解为一个容器,里面保存着某个未来才会结束的事件的结果。
特点
(1)对象的状态不受外界影响,只有三个状态:pending(进行中)、fulfilled(成功)、rejected(失败)。
(2)状态一旦改变就不会再变了。状态改变只有两种情况,要么是从pending到fulfilled,要么是从pending到rejected,之后便一直保持fulfilled或者rejected,这称为已定型(resolved)。
优缺点
优点:解决了著名的回调地狱问题;更好地进行错误捕获。
缺点:一旦开始就无法取消;不设置回调函数的话,内部抛出的错误不会反映到外部。
Promise的基本用法
概述
首先是如何构造一个Promise对象,它的构造函数接受一个函数做参数,而这个函数的两个参数分别是resolve和reject两个函数,注意这两个参数是由JS引擎提供的。
const promise=new Promise(function(resolve,reject){});
“resolve函数的作用是,将Promise对象的状态从“未完成”变为“成功”(即从 pending 变为 resolved),在异步操作成功时调用,并将异步操作的结果,作为参数传递出去;reject函数的作用是,将Promise对象的状态从“未完成”变为“失败”(即从 pending 变为 rejected),在异步操作失败时调用,并将异步操作报出的错误,作为参数传递出去。”
如果resolve和reject带有参数的话会被传递给回调函数,reject通常带的是Error对象的实例,而resolve除了正常值也可以带另一个Promise实例。
const promise = new Promise(function(resolve, reject) {
// ... some code
if (/* 异步操作成功 */){
resolve(value);
} else {
reject(error);
}
});
回调函数
then方法接受两个参数,就是分别对应Promise实例生成以后resolved状态和rejected状态的回调函数。
promise.then(function(value) {
// success
}, function(error) {
// failure
});
eg1:
eg2:
catch方法接受一个参数,用来指定发生错误时的回调函数。
promise.catch( function(error) {
// failure
});
eg:
一般来说,不要在then()方法里面定义 Reject 状态的回调函数(即then的第二个参数),总是使用catch方法。
回调函数的返回值
我们经常看到Promise的链式调用形式,这是因为回调函数返回的结果依然是promise对象,所以可以继续在后面使用then方法以及catch方法。
主要有以下两种情况:
(1)回调函数的返回值是非Promise值,如下所示:
我们可以发现.then会把返回值包装成一个状态为fulfilled的Promise实例。
再看下面这个例子,我们可以发现catch也是一样。
所以我们可以得出如果回调函数的返回值是非promise值,返回结果将是一个状态为fulfilled的Promise。该返回值也会作为参数向下传递。
(2)回调函数的返回值是Promise值,如下所示:
这里我们分别采用了then方法和catch方法以及返回值为fulfilled和rejected状态的Promise,不难发现then和catch的返回结果就由该Promise值来决定。
对了还有一种情况是没有返回值,我的理解是如果没有返回值的话那么就不会进入下一个then方法,但如果其间有错误出现的话则会继续被之后的catch捕获。
参考:
阮一峰ECMAScript 6 入门Promise篇
以及这位大佬关于Promise回调函数返回值的相关讲解