对于promise,之前多用在对调取接口的封装中,也有很多其他地方的用法,但用的一直不熟,今天特地拿出来梳理一下;
Promise实列有三个状态:
pending (进行中)
resolved (成功)
rejected(失败)
常用的方法有:then()、catch()、all()、race()、finally()。
let obj = new Promise((resolve,reject) => {
//...
resolve('resolve success')
console.log('after resolve');
reject('reject error');
});
obj.then(result => {
console.log(result);
});
obj.catch(result => {
console.log(result);
})
obj.finally(result => {
console.log(result);
})
async用于申明一个function是异步的,而await可以认为是async wait的简写,等待一个异步方法执行完成。需要注意的是:await只能用在async函数里面。async 函数返回一个 Promise 对象,可以使用 then 方法添加回调函数。当函数执行的时候,一旦遇到 await 就会先返回,等到触发的异步操作完成,再接着执行函数体内后面的语句。
下面一个例子,执行顺序。
async function func() {
console.log(0);
await new Promise(resolve => {
setTimeout(() => {
console.log(1);
resolve();
}, 1000);
});
setTimeout(() => {
console.log(2);
}, 0);
console.log(3);
}
func();
// 0
// 1 ---2秒后执行
// 3
// 2
await会 在你Promise返回结果后才会执行async后面的语句,若Promise不返回结果:resolve / reject,那么后面的代码就不会执行
async function func() {
console.log(1);
await new Promise(function(resolve, reject) {
setTimeout(function() {
console.log(2);
}, 2000);
});
console.log(3);
}
func();
// 1
// 2 ---2秒后输出
// 3不会被执行到
如果 await 后面的 Promise 返回一个reject状态的结果的话,则会被当成错误在后台抛出
async function func() {
console.log(1);
var result = await new Promise(function(resolve, reject) {
setTimeout(function() {
reject(2);
}, 2000);
});
console.log(3);
}
func();
// 1
// Uncaught (in promise) 2