Promise 是什么?
来源:互联网 发布:淘宝宝贝排名不稳定 编辑:程序博客网 时间:2024/05/22 12:17
Promise对象代表一个异步操作,有三种状态:Pending(准备状态),Fulfilled(成功状态,也称为Resolved状态),Rejected(失败状态)。只有异步操作的结果可以决定promise对象的状态,操作成功后,promise对象由Pending状态转换为Fulfilled状态,此时回调函数会执行 onFulfilled方法。反之,操作失败,promise对象由pending状态转换为Rejected状态,此时回调函数会执行onRejected方法。
如下图所示:
创建一个Promise对象
var p1 = new Promise(function(resolve,reject){ resolve('resolve');});var p2 = new Promise(function(resolve,reject){ reject('reject');});
p1 返回一个resolved状态,值为resolve的Promise对象
Promise {[[PromiseStatus]]: "resolved", [[PromiseValue]]: "resolve"}
p2 返回一个rejected状态,值为reject的Promise对象
Promise {[[PromiseStatus]]: "rejected", [[PromiseValue]]: "reject"}
Promise 的基本API
1.Promise#then
Promise.then(onFulfilled,onRejected)
then方法定义了promise状态变为resolved或者rejected状态之后的回调函数:
- pending->resolved:执行onFulfilled函数,并且将promise对象的值传给onFulfilled函数
- pending->rejected:执行onRejected函数,并且将promise对象的值传给onRejected函数
代码示例如下:
var p = new Promise(function(resolve, reject){ console.log("create a promise"); resolve("success");});console.log("after new Promise");p.then(function onFulfilled(value){ console.log(value);},function onRejected(error){ console.log(error);});
运行结果如下:
"create a promise""after new Promise""success"
2.Promise#catch
new Promise返回一个resolved状态的promise对象,所以在p.then()方法中调用的是onFulfilled函数。
创建promise时,promise对象中的函数是立即执行的,并不是在调用then方法的时候才会去执行,所以首先会输出"create a promise"。但是执行的代码是异步代码,所以"after new Promise"会在"success"之前输出。
2.Promise#catch
promise.catch(onRejected);
catch方法捕获了promise运行过程中的异常。catch与then方法中的onRejected的不同是,onRejected 函数只能在promise状态变为rejected的时候调用,但catch既可以在promise状态变为rejected的时候调用,又可以捕获第一个onFulfilled方法中出现的错误。
可以参考promise迷你书中的这一段代码:
function throwError(value) { // 抛出异常 throw new Error(value);}// <1> onRejected不会被调用function badMain(onRejected) { return Promise.resolve(42).then(throwError, onRejected);}// <2> 有异常发生时onRejected会被调用function goodMain(onRejected) { return Promise.resolve(42).then(throwError).catch(onRejected);}// 运行示例badMain(function(){ console.log("BAD");});goodMain(function(){ console.log("GOOD");});
在这段代码中,badMain函数中传入onRejected参数,因为Promise.resolve(42)返回一个resolved状态的promise对象(这个api的用法会在下一节中说到),所以会去调用throwError函数,throwError函数中抛出的异常onRejected是捕获不到的,但是catch可以捕获到。
3.Promise.resolve
这个方法会根据传进来的参数的不同,返回不同的promise对象。
//1.传入的参数是一个普通值var p1 = Promise.resolve(1);//返回一个将该对象作为值的新promise对象//2.传入的参数是一个Promise对象var p2 = Promise.resolve(p1);//返回接收到的promise对象p1 === p2 //true
- Promise 是什么?
- promise是什么,使用方法
- promise
- Promise
- Promise
- Promise
- Promise
- Promise
- Promise
- promise
- promise
- promise
- promise
- Promise
- Promise
- promise
- promise
- Promise
- C++三大特性封装继承多态
- 实现一个栈Stack,要求实现Push(入栈)、Pop(出栈)、Min(返回最小值的操作)的时间复杂度为O(1)
- kafka单机搭建和测试
- 交换一维数组中最大、最小元素
- JS函数6
- Promise 是什么?
- jquery准确获取元素
- 16CF1--B-1002
- CodeChef
- php扩展开发入门
- Java中list集合为空或为null的区别
- Android 基于SurfaceView 开发示波器
- MemoryAnalyzer 调试内存泄漏
- 递归算法问题: 有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不会死。问: 第20个月的兔子总对数为多少?(提示:先分析兔子的增长规律)