promise是异步编程的解决方案,比传统的回调函数更合理更强大
一般new一个promise容器,promise容器里有三个状态,但是每次只能存在一个状态,一旦成功不会改变,缺点:无法取消,中途回调函数报错不会反映到外部,即下面图片的三个小圈,pending正在执行,resolve是成功的,reject是失败的
成功后就把data传到resolve这个状态中
then里的第一个function就是resolve,第二个function就是reject
代码图示:
then(function(){return aaa},function(){return bbb}).then(aaa的结果,bbb的结果)
promise.then(onresolve,onreject)//在onresolve发生异常,在onreject捕获不到这个异常
promise.then(onresolve).catch //catch能捕获到异常 catch后还能在catch到错误,catch后还能继续then
//setTimeout产生的错误不会被catch捕获到,因为在js中catch先在setTimeout回调之前执行
//在all(数组)成功则返回一个结果数组,失败则返回第一个reject失败状态的值
async ,await 的执行顺序
从字面意思上看await就是等待,await 等待的是一个表达式,这个表达式的返回值可以是一个promise对象也可以是其他值。
很多人以为await会一直等待之后的表达式执行完之后才会继续执行后面的代码,实际上await是一个让出线程的标志。await后面的表达式会先执行一遍,将await后面的代码加入到微任务队列中,然后就会跳出整个async函数来执行后面的代码。
由于因为async await 本身就是promise+generator的语法糖。所以await后面的代码是微任务
async function async1() {
console.log('start');
await async2();
console.log('end');
}
等价于
async function async1() {
console.log('start');
Promise.resolve(async2()).then(() => {
console.log('end');
})
}