1.Promise的用途
Promise 是1976年的一种设计模式,是前端解决异步问题的统一方案
它很好的解决了下面三个问题:
- 规范回调的名字或顺序
- 拒绝回调地狱,让代码可读性更强
- 很方便地捕获错误
2.如何创建一个 new Promise
return new Promise((resolve,reject)=>{...})
成功调用resolve,失败调用rejectfunction(){return new Promise(function (resolve, reject) {// ...if (/* 异步操作成功 */){resolve(value);} else { /* 异步操作失败 */reject(new Error());}})}
3.如何使用 Promise.prototype.then
.then()方法可以添加多个回调函数(可进行链式操作).then(success,fail)
其中第一个参数是成功,也就是调用resolved状态的回调函数
第二个参数是失败,也就是调用rejected状态的回调函数
同时.then()里参数是可选的,可以只写一个var p1 = new Promise(function (resolve, reject) {resolve('成功')})p1.then(console.log, console.error) // "成功"// 链式使用p1.then().then().then(console.log, console.error)
4.如何使用 Promise.all
Promise.all(iterable)返回一个Promise实例返回值:
如果传入的参数是一个空的可迭代对象,则返回一个已完成(already resolved)状态的Promise如果传入的参数不包含任何 promise,则返回一个异步完成(asynchronously resolved)Promise(注:Google Chrome 58 在这种情况下返回一个已完成)其它情况下返回一个处理中(pending)的Promise。之后会在所有的promise都成功,返回成功的值;或者有一个失败就返回失败
参数iterable:是一个可迭代对象,如Array或StringPromise.all可以将多个Promise实例包装成一个新的Promise实例。
同时,成功和失败的返回值是不同的,成功的时候返回的是一个结果数组,而失败的时候则返回最先被reject失败状态的值(全部成功才成功,有一个失败就失败)
let p1 = new Promise((resolve, reject) => {resolve('成功')})let p2 = 200let p3 = Promise.reject('失败')Promise.all([p1, p2]).then((result) => {console.log(result) // ["成功",200]}).catch((error) => {console.log(error)})Promise.all([p1,p3,p2]).then((result) => {console.log(result)}).catch((error) => {console.log(`error:${error}`) // 失败了,打出 '失败'})
不加后面的catch,让这个Promise失败,图示:
注:Promise.all()中哪个在前,哪个的结果就在前面,不会根据得到结果的时间顺序来排序
5.如何使用 Promise.race
Promise.race也是将多个Promise实例包装成一个新的Promise实例(race,就是竞赛的意思)Promise.race([p1, p2, p3])里面哪个结果获得的快,就返回那个结果,不管结果本身是成功状态还是失败状态
如果传的迭代是空的,则返回的promise将永远等待
let p1 = new Promise((resolve, reject) => {setTimeout(() => {resolve('one')},1000)// 等同于 setTimeout(resolve, 1000, 'one'),此法不推荐使用,有安全风险})let p2 = new Promise((resolve, reject) => {setTimeout(() => {resolve('two')}, 500)})Promise.race([p1,p2]).then(function(result){console.log(result)})// 'two'
6.Promise的执行顺序
Promise(微任务)的回调函数属于异步任务,会在同步任务之后执行
console.log(1)setTimeout(function() {console.log(2);}, 0);new Promise(function (resolve, reject) {console.log(3)resolve(4);console.log(5)}).then(console.log);console.log(6);// 1 3 5 6 4 2
-
new Promise里的是同步任务,立即执行 -
.then任务即为微任务,同步之后,普通异步之前 -
setTimeout为普通异步任务 ```javascript async function async1() { console.log(1); const result = await async2(); console.log(3); }
async function async2() { console.log(2); }
Promise.resolve().then(() => { console.log(4); });
setTimeout(() => { console.log(5); });
async1(); console.log(6); // 1 2 6 4 3 5 ```
-
async里面没有await为同步任务,遇到await暂停该函数执行,可以理解为一个.then回调
