理解
promise可以理解为一个对象,该对象包含了一个还未完成的一个异步函数的结果(成功/失败),我们可以对其成功或者失败的结果进行进一步的处理。
mdn对promise 3种状态的描述:
- 待定(pending) :初始状态,既没有被兑现,也没有被拒绝。这是调用 fetch() 返回 Promise 时的状态,此时请求还在进行中。
- 已兑现(fulfilled) :意味着操作成功完成。当 Promise 完成时,它的 then() 处理函数被调用。
- 已拒绝(rejected) :意味着操作失败。当一个 Promise 失败时,它的 catch() 处理函数被调用。
var myPromise = function() {
return new Promise((resolve, reject) => {
setTimeout(() {
resolve()
}, 1500)
})
}
console.log(myPromise());
myPromise().then(res => {
console.log('success')
});
console.log('开始执行')
上例中发生以下几件事情:
1、定义了一个promise对象,打印Promise { <state>: "pending" }
;
2、调用myPromise()并在then方法中传入异步函数执行成功的处理函数;
3、继续执行后面的同步代码,打印'开始执行'
;
4、1.5s后myPromise触发成功的回调,打印'success'
。
链式调用
在then的回调函数中,可以return 出去一个处理对象,交给下一个then的回调函数进行处理。
fetch('/api/getData')
.then(response => {
return response.json();
})
.then(res => {
console.log(res);
})
错误捕获
在异步函数执行过程中,或者在then的回调函数处理中抛出错误,promise都会在最后的catch的回调函数中捕获到。
fetch('/api/getData')
.then(response => {
if (!response.ok) {
throw new Error('请求错误')
}
return response.json();
})
.then(res => {
console.log(res);
})
.catch(err => {
console.log(err)
})
async/awiat
可以理解为通过同步的写法来写异步函数,注意await 关键词必须在async 函数中,来配合使用,单独使用会抛出错误。
async function func() {
var response = await fetch('/api/getData');
var res = response.json();
console.log(res)
}
func()
捕获执行过程中的错误,可以采用2种方式:
1、使用try...catch
async function func() {
try{
var response = await fetch('/api/getData');
var res = response.json();
console.log(res);
} catch(err) {
console.log(err)
}
}
func()
2、await 后面的异步代码跟上catch
async function func() {
var response = await fetch('/api/getData')
.catch(err => {
console.log(err)
})
var res = response.json();
console.log(res)
}
func()