promise的三个状态: pending(默认) fulfilled(成功) rejected(失败)
- resolve函数被执行时, 会将promise的状态从 pending 改成 fulfilled 成功
- reject函数被执行时, 会将promise的状态从pending 改成 rejected 失败
Promise.reject()
new Promise((resolve, reject) => {
reject()
})
Promise.resolve()
new Promise((resolve, reject) => {
resolve()
})
Promise.all([promise1, promise2, promise3]) 等待原则, 是在所有promise都完成后执行, 可以用于处理一些并发的任务
// 后面的.then中配置的函数, 是在前面的所有promise都完成后执行, 可以用于处理一些并发的任务
Promise.all([promise1, promise2, promise3]).then((values) => {
// values 是一个数组, 会收集前面promise的结果 values[0] => promise1的成功的结果
})
Promise.race([promise1, promise2, promise3]) 赛跑, 竞速原则, 只要三个promise中有一个满足条件, 就会执行.then(用的较少)
Promise
处理异步请求的
1、主要用于异步计算
2、可以将异步操作队列化,按照期望的顺序执行,返回符合预期的结果
3、可以在对象之间传递和操作promise,帮助我们处理队列
resolve作用是,将Promise对象的状态从“未完成”变为“成功”(即从 pending 变为 resolved),在异步操作成功时调用,并将异步操作的结果,作为参数传递出去;
reject作用是,将Promise对象的状态从“未完成”变为“失败”(即从 pending 变为 rejected),在异步操作失败时调用,并将异步操作报出的错误,作为参数传递出去。
promise有三个状态:
1、pending[待定]初始状态
2、fulfilled[实现]操作成功
3、rejected[被否决]操作失败
Promise对象的状态改变,只有两种可能:
从pending变为fulfilled
从pending变为rejected。
这两种情况只要发生,状态就凝固了,不会再变了。
.then()
1、接收两个函数作为参数,分别代表fulfilled(成功)和rejected(失败)
2、.then()返回一个新的Promise实例,所以它可以链式调用
3、当前面的Promise状态改变时,.then()根据其最终状态,选择特定的状态响应函数执行
错误处理两种做法:
第一种:reject(‘错误信息’).then(() => {}, () => {错误处理逻辑})
第二种:throw new Error(‘错误信息’).catch( () => {错误处理逻辑})
推荐使用第二种方式,更加清晰好读,并且可以捕获前面所有的错误(可以捕获N个then回调错误)
Promise.all() 批量执行
Promise.all([p1, p2, p3])用于将多个promise实例,包装成一个新的Promise实例,返回的实例就是普通的promise
它接收一个数组作为参数
数组里可以是Promise对象,也可以是别的值,只有Promise会等待状态改变
当所有的子Promise都完成,该Promise完成,返回值是全部值得数组
有任何一个失败,该Promise失败,返回值是第一个失败的子Promise结果
Promise.race() 类似于Promise.all() ,区别在于它有任意一个完成就算完成
Promise是异步编程的一种解决方案,将异步操作以同步操作的流程表达出来,避免了层层嵌套的回调函数。
promise实际上解决jquery的ajax回调地域(解决层层嵌套),
只是异步编程的一种解决方案
三种状态:pending(进行中)、fulfilled(已成功)和rejected(已失败)Promise 构造函数包含一个参数和一个带有 resolve(解析)和 reject(拒绝)两个参数的回调
promise 缺点: 无法取消promise,如果不设置回调函数,promise内部抛出错误 第三,当处于pending状态时,无法得知目前进展到哪一个阶段(刚刚开始还是即将完成)
axios是一个基于Promise的方法,可以发送get、post等请求,并且前后端都可以使用。
axios 是一个基于Promise 用于浏览器和 nodejs 的 HTTP 客户端
promise是异步编程的一种解决方案,它出现的初衷是为了解决回调地狱的问题。
new Promise((resolve, reject)=> {
if('some option') {
resolve('some value');
} else {
reject('some error');
}
}).then(
val=> {
// ...
},
error=> {
// ...
}
)
Promise.prototype.then
当Promise中的状态(pending —> resolved or rejected)发生变化时才会执行then方法。
Promise.resolve()
除了通过new Promise()的方式,我们还有两种创建Promise对象的方法,Promise.resolve()相当于创建了一个立即resolve的对象
Promise.reject()
和Promise.resolve()类似,只不过一个是触发成功的回调,一个是触发失败的回调
Promise.all()全部完成(resolved)”或参数中不包含 promise 时回调完成(resolve);
如果参数中 promise 有一个失败(rejected),此实例回调失败(reject),失败原因的是第一个失败 promise 的结果
Promise.race()方法返回一个 promise,一旦迭代器中的某个promise解决或拒绝,返回的 promise就会解决或拒绝。
1、promise 有 3 种状态:pending(进行中)、fulfilled(已完成,又称为Resolved) 或 rejected(已失败)。状态改变只能是 pending->fulfilled 或者 pending->rejected,状态一旦改变则不能再变。
2、new promise实例,要return
3、new promise时要传入函数,函数有resolve、reject两个参数
4、成功时执行resolve(),失败时执行reject()
5、then监听结果
Promise.all() 全部完成返回全部值的数组,其中有一个失败,返回第一个失败
Promise.race() 和all类似,区别是一个成功就是成功,一个失败就是失败了
手写一个promise
var promise = new Promise((resolve, reject) => {
if (操作成功) {
resolve(value);
} else {
retject(error);
}
});
promise.then(function(value) {
// success
}, function(value) {
// failure
})
基于promise的async 和await的区别
async用于函数声明,表示声明的函数为一个异步函数,这个函数返回一个Promise对象(resolve);
await:表示在这里等待promise返回结果,(resolve返回)
await必须写在async函数中
async function getData(){
}//返回一个promise对象
async、await
async使用在函数前面,把函数变成一个异步函数,返回值是个promise对象。
await只能使用在async声明的函数里,不能使用在普通函数里。
Async/Await让我们用少量的代码来使用Promise,我们可以将一些有依赖关系的回调函数的处理逻辑放在async里面,然后在非async的区域使用,这样可以减少then或者catch回调。
使用 async / await, 搭配 promise, 可以通过编写形似同步的代码来处理异步流程, 提高代码的简洁性和可读性.
相较于 Promise,async/await有何优势
- 同步化代码的阅读体验(Promise 虽然摆脱了回调地狱,但 then 链式调⽤的阅读负担还是存在的)
- 和同步代码更一致的错误处理方式( async/await 可以⽤成熟的 try/catch 做处理,比 Promise 的错误捕获更简洁直观)
- 调试时的阅读性, 也相对更友好