异步回调promise

创建一个promise对象

let promise = new Promise((resolve,reject)=>{
  // resolve 代表的是成功的回调函数 
  // reject 代表的是失败的回调函数
});
//打印promise
console.log(promise);

resolve 和 reject 回调函数由谁提供?
在promise原型里有then和catch方法,resolve由then方法提供,reject由catch方法提供。
then方法表示的是成功之后的回调;catch方法表示的是失败之后的回调。

模拟异步请求

let promise = new Promise((resolve, reject) => {
	// 模拟异步请求
	if (3 > 2) {
		resolve('success')
	} else {
		reject('error')
	}
});

// 实例方法
promise.then(
	// 执行的是成功的回调函数
	(res) => {
		console.log(res, '请求成功');
	}
).catch(
	// 执行的是失败的回调函数
	(err) => {
		console.log(err, '请求失败');
	}
).finally(() => {
	console.log('最终执行');
});

promise示例

let p1 = new Promise(function (resolve, reject) {
	if (1 > 0) {
		resolve("成功");
	} else {
		reject("失败");
	}
})
p1.then((res) => {
	console.log(res);
}).catch((err) => {
	console.log(err);
})

在这里插入图片描述
在这里插入图片描述

let p2 = new Promise((resolve, reject) => {
	setTimeout(() => {
		let data = '用户的数据';
		resolve(data); //调用resolve之后,对象状态变为成功
		// reject('数据读取失败');
	}, 1000);
})
p2.then((res) => {
	console.log(res, '成功');
}, (err) => {
	console.log(err, '失败');
})

在这里插入图片描述

promise写法

let promise = new Promise((resolve, reject) => {
	if (res) {
		resolve(res);
	} else {
		reject(err);
	}
})
promise.then((res) => {
	console.log(res);
}).catch((err) => {
	console.log(err)
})

封装promise

//考虑到可能有多个请求需要发送,需要创建多个承诺对象,所以采用工厂函数进行封装
 function getPromise(url,method='get',data=null){
    return new Promise((resolve,reject)=>{
        $.ajax({
            url:url,
            method:method,
            data:data,
            success(res){
                resolve(res)
            },
            error(err){
                reject(err)
            }
        })
    })
 }
 let p1=getPromise('url');
 let p2=getPromise('url');
  // p1.then((res)=>{
  //     console.log(res,'1111111')
  // })
  // p2.then((res)=>{
  //     console.log(res,'222222')
  // })
  // all 只有两个异步操作请求都成功才会返回成功的结果,否则返回失败对象
  // race 谁的响应先拿到用谁的结果 无论成功与否
  //any 有成功用成功的,都失败就失败
  let p=Promise.any([p1,p2]);
  p.then((res)=>{
      console.log(res)
  }).catch((err)=>{
      console.log(err)
  })

async函数返回值

在这里插入图片描述
async使用:等待一个函数执行完毕后,执行另外一个函数。

function testAwait() {
	return new Promise((resolve) => {
		setTimeout(function () {
			console.log("testAwait");
			resolve();
		}, 1000);
	});
}

async function helloAsync() {
	await testAwait();
	console.log("helloAsync");
}
helloAsync();
 // testAwait
 // helloAsync

在这里插入图片描述

async await和promise的对比

getJSON = () => {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            resolve('返回的数据')
        },200)
    })
}

// 使用Promise
const makeRequest = () =>
    getJSON()
        .then(data => {
            console.log(data)
            return "done"
        })

makeRequest()

// 使用async await
const makeRequest = async () => {
    console.log(await getJSON())
    return "done"
}

makeRequest()

使用try、catch和finally来捕获异常

try {
	console.log("try")
} catch (error) {
	// console.log(error);
	throw new Error('请求失败')
} finally {
	console.log('最终都会执行');
}

对原生ajax进行封装

function promise(method, url) {
	return new Promise((resolve, reject) => {
		// 创建XMLHttpRequest的实例对象
		let xhr = new XMLHttpRequest();
		// 打开一个连接
		xhr.open(method, url);
		// 发送请求
		xhr.send();
		// 接收响应
		xhr.onreadystatechange = function () {
			if (xhr.readyState === 4) {
				if (xhr.status === 200) {
					// 代表请求成功 
					resolve(xhr.responseText)
				} else {
					// 代表请求失败
					reject(xhr.responseText)
				}
			}
		}
	})
}
let p1 = promise('get', 'https://api.muxiaoguo.cn/api/lishijr?api_key=51247282aed5c8dc');
let p2 = promise('get', 'https://api.muxiaoguo.cn/api/xiaohua?api_key=fd3270a0a9833e20');
p1.then(res => {
	console.log(res, '获取响应1');
});
p2.then(res => {
	console.log(res, '获取响应2');
});

Promise中的静态方法(只能由构造函数本身去调用)// 实例全部成功返回一个承诺对象

all(); 实例状态全部成功,返回的承诺对象状态才是成功
any(); 实例状态任意一个成功,返回的承诺对象状态就是成功
race(); 实例状态返回请求先成功的那一个
allSettled(); 返回全部处理实例

let res = Promise.all([p1, p2]);
console.log(res);

// 任意一个实例状态成功返回成功的实例
let res1 = Promise.any([p1, p2]);
console.log(res1);

// race 赛跑 返回请求先成功的实例对象
let res2 = Promise.race([p1, p2]);
console.log(res2);

// 返回的处理格式 array:[{},{}]
let res4 = Promise.allSettled([p1, p2]);
console.log(res4);
res4.then(res => {
	console.log(res);
})

参考

  1. https://blog.csdn.net/whl0071/article/details/126321163
  2. https://blog.csdn.net/Serena_tz/article/details/114285024
  3. https://blog.csdn.net/lq313131/article/details/126936284
  4. es6官方文档

猜你喜欢

转载自blog.csdn.net/Serena_tz/article/details/128560383