赞
踩
Promise 是异步编程的一种解决方案,比传统的解决方案(回调函数和事件)更合理和更强大。它由社区最早提出和实现,ES6 将其写进了语言标准,统一了用法,原生提供了Promise对象。所谓Promise,简单说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果。从语法上说,Promise 是一个对象,从它可以获取异步操作的消息。Promise 提供统一的 API,各种异步操作都可以用同样的方法进行处理。有了Promise对象,就可以将异步操作以同步操作的流程表达出来,避免了层层嵌套的回调函数。此外,Promise对象提供统一的接口,使得控制异步操作更加容易。
Promise构造函数接受一个函数作为参数,该函数的两个参数分别是resolve和reject。
它们是两个函数,由 JavaScript 引擎提供。
Promise对象代表一个异步操作有三种状态: pending(进行中)、fulfilled(已成功)和rejected(已失败)。
状态发生改变之后就凝固了,不会再变了,会一直保持这个结果,这时就称为 resolved(已定型)
const promise = new Promise(function(resolve, reject) {
// ... some code
if (/* 异步操作成功 */){
resolve(value); // pending -> fulfilled
} else {
reject(error); // pending -> rejected
}
});
定义在Promise.prototype中的方法,通过Promise实例可以直接调用
Promise.prototype.then()
当状态由pending变为fulfilled的时候执行该回调函数,
参数:回调函数,回调函数的参数为resolve函数传递过来的值
返回值:返回一个新的Promise实例对象,因此可以使用链式调用
Promise.prototype.catch()
当状态由pending变为rejected的时候执行该回调函数
参数:回调函数,回调函数的参数为reject函数传递过来的值
返回值:返回一个新的Promise实例对象,因此可以使用链式调用
Promise.prototype.finally()
当状态由pending变为fulfilled或者rejected的时候都执行该回调函数,
参数:回调函数
返回值:返回一个新的Promise实例对象
- const promise = new Promise(function (resolve, reject) {
- if (1 > 0) {
- resolve('success') // promise状态 pending => fulfilled
- } else {
- reject('error') // promise状态 pending => rejected
- }
- })
-
- // .then 后面跟上.catch 这种写法,叫链式调用
- // 都是promise来调用的
- // promise状态变为fulfilled时,执行.then
- // promise状态变为rejected时,执行.catch
- // resolve函数对应成功的回调 => .then()内部的回调
- // reject函数对应失败的回调 => .catch()函数内部的回调
- promise.then((res) => {
- // 成功的回调,拿到resolve('suceess')的传递过来的实参
- console.log(res);
- }).catch((error) => {
- // 失败的回调,拿到reject('error')的传递过来的实参
- console.log(error);
- })

- <!DOCTYPE html>
- <html lang="en">
-
- <head>
- <meta charset="UTF-8">
- <meta http-equiv="X-UA-Compatible" content="IE=edge">
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
- <title>promise-ajax</title>
- <script src="./js/jquery.js"></script>
- <script>
- const baseURL = 'http://47.94.46.113:8888';
- const promise = new Promise((resolve, reject) => {
- // 异步请求
- $.ajax({
- url: baseURL + '/index/category/findAlll',
- method: 'get',
- success(res) {
- // 异步请求成功,将成功结果作为实参传递到resolve回调中去
- resolve(res);
- },
- error(error) {
- // 异步请求失败,将失败结果作为实参传递到reject回调中去
- reject(error);
- }
- })
- })
- // 监听promise实例状态的改变
- promise.then((res) => {
- console.table(res.data);
- }).catch((error) => {
- console.error(error);
- }).finally(() => {
- console.log('最终执行');
- })
- </script>
- </head>
-
- <body>
-
- </body>
-
- </html>

- <!DOCTYPE html>
- <html lang="en">
-
- <head>
- <meta charset="UTF-8">
- <meta http-equiv="X-UA-Compatible" content="IE=edge">
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
- <title>promise工厂函数</title>
- <script src="./js/jquery.js"></script>
- <script>
- const baseURL = 'http://47.94.46.113:8888';
-
- function getPeomise(url, method) {
- return new Promise((resolve, reject) => {
- $.ajax({
- url: baseURL + url,
- method,
- success(res) {
- resolve(res);
- },
- error(error) {
- reject(error);
- }
- })
- })
- }
-
- let pro1 = getPeomise('/index/category/findAll', 'get');
- let pro2 = getPeomise('/index/article/findHotArticles', 'get');
-
- // 静态方法
- // let newPro = Promise.any([pro1, pro2]);
-
- // newPro.then(res => {
- // console.log(res);
- // }).catch(error => {
- // console.log(error);
- // })
-
- // 访问pro1这个promise实例内部的状态
- // pro1.then(res => {
- // console.table(res.data);
- // }).catch(error => {
- // console.error(error);
- // })
-
- // pro2.then(res => {
- // console.table(res.data);
- // }).catch(error => {
- // console.error(error);
- // })
-
- let obj = {
- name: '张三',
- age: 12
- }
- let proObj = Promise.reject(obj);
- console.log(proObj);
- </script>
- </head>
-
- <body>
-
- </body>
-
- </html>

定义在Promise中的方法,通过Promise可以直接调用
Promise.all([p1,p2])
用于将多个 Promise 实例,包装成一个新的 Promise 实例,
参数:数组,数组中的元素为Promise实例
返回值:Promise实例,当p1,p2状态都为fulfilled时候,该实例的状态才为fulfilled,此时p1,p2的返回值组成一个数组,传递给该实例的回调函数;只要p1,p2的返回值有一个变为rejected,该实例状态为rejected
Promise.race([p1,p2])
用于将多个 Promise 实例,包装成一个新的 Promise 实例,
参数:数组,数组中的元素为Promise实例
返回值:Promise实例,当p1,p2之中有一个实例率先改变状态,该实例的状态就跟着改变。那个率先改变的 Promise 实例的返回值,就传递给该实例的回调函数。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。