Promise
Promise接受一个进行异步操作的执行函数(executor), 默认参数是resolve和reject,初始状态为pending, 执行成功则调用resolve,返回结果,状态为 fullfilled,出现error则调用reject, 状态为 rejected
let promise = new Promise((resolve, reject)=>{
setTimeout(()=>{
let n = Math.floor(Math.random() * 6 + 1)
if(n > 3){
resolve(n)
} else {
reject(new Error('you lose'))
}
},1000)
})
promise接受.then操作,then的参数为2个函数,如果promise resolve则调用第一个函数,如果reject则调用第二个函数
promise.then((res)=>{console.log(res)}, (err)=>{console.log(err)})
如果只想捕获error, 可以用.catch
promise.catch(err => {console.log(err)})
当然你也可以写一个函数,让这个函数返回promise
function fn(){
return new Promise((resolve, reject)=>{
setTimeout(()=>{
let n = Math.floor(Math.random() * 6 + 1)
if(n > 3){
resolve(n)
} else {
reject(new Error('you lose'))
}
},1000)
})
}
fn().then((res)=>{console.log(res)}, (err)=>{console.log(err)})
Promise.all
Promise.all 接受一个promise数组,等待所有的promise都settle,如果所有的promise都resolve, 则执行.then的第一个函数,返回值是个数组,只要有任意一个promise reject,就抛出错误,执行.then的第二个函数
function fn(){
return new Promise((resolve, reject)=>{
setTimeout(()=>{
let n = Math.floor(Math.random() * 6 + 1)
if(n > 3){
resolve(n)
} else {
reject(new Error('you lose'))
}
},1000)})
}
Promise.all([fn(), fn()])
.then((res)=>{console.log(res)}, (err)=>{console.log(err)})
Promise.race
Promise.race 同样接受一个promise数组,只要有一个promise resolve或reject, 其他的promise就会忽略,并根据这个promise是resolve还是reject各自调用.then的函数
Promise.allSettled
Promise.allSettled同样接受一个promise数组,会等待所有promise settle, 返回的结果数组,包含了每个promise的status和 value或reason
[
{status: 'fulfilled', value: ...response...},
{status: 'fulfilled', value: ...response...},
{status: 'rejected', reason: ...error object...}
]
async/await
async能与promise结合使用,使异步函数更像是标准的同步函数
function前的async
的作用:
- 让这个函数总是返回一个 promise。
- 允许在该函数内使用 await。
Promise 前的关键字 await
使 JavaScript 引擎等待该 promise settle,然后:
- 如果有 error,就会抛出异常 — 就像那里调用了 throw error 一样。
- 否则,就返回结果。
我们可以用
try..catch
来捕获error ```javascript function fn(){ return new Promise((resolve, reject)=>{ setTimeout(()=>{ let n = Math.floor(Math.random() * 6 + 1) if(n > 3){ resolve(n) } else { reject(new Error(‘you lose’)) }},1000)}) }
async function fn2(){ try{ let result = await fn() console.log(result) } catch(err){ console.log(err) }
}
fn2()
await后面如何接多个promise?<br />await后接Promise.all或者Promise.race, Promise.all或Promise.race仍然是个promise
```javascript
async function fn2(){
try{
let result = await Promise.all([fn(),fn(),fn()])
console.log(result)
} catch(err){
console.log(err)
}
}