js异步编程-async,await以及不可以取代的Promise

ES7带来了async和await,让js的异步编程更加方便。

async和await的简单语法实验

async和await是Promise的语法糖,让书写更加方便。但是他们是取代不了Promise的。他们是建立在promise机制上的。
简单语法试验:
(1)
正常情况下,可以看出也打印出来一个Promise。其中Promise状态是‘resolved’;
js异步编程-async,await以及不可以取代的Promise

(2)
这种情况下,看出Promise状态是'rejected'。并报错,不想报错“红错”,可以使用try...catch
js异步编程-async,await以及不可以取代的Promise
(3)
将报错信息catch到。
js异步编程-async,await以及不可以取代的Promise


async,await简介

async
async是用来表示函数是异步的,出现async,会返回一个Promise对象,就可以使用then方法,方便的添加回调函数了。是语法更加简洁。

await
必须出现在async中,不可单独使用;
await后面可以跟任何js表达式,也就是awati可以等很多类型的东西,但主要是等Promise对象被状态被resolved。


小示例

注意:reject('123'),需要try,catch才能将信息拿出来。
例子:
(1)resolve正常情况下可以拿出。
js异步编程-async,await以及不可以取代的Promise

(2)reject拿不出
js异步编程-async,await以及不可以取代的Promise
(3)reject需要用try,catch获取信息
js异步编程-async,await以及不可以取代的Promise


不要将并发请求发成了阻塞式同步

如:

function aa(second){

return new Promise((resolve,reject) => {
    setTimeout(() => {
        resolve('request done'+Math.random());
    },second);
})

}

async function bugDemo(){

await aa(1000);
await aa(1000);
await aa(1000);
console.log('clear the loading~');

}

bugDemo();

不阻塞的写法
function aa(second){

return new Promise((resolve,reject) => {
    setTimeout(() => {
       console.log('request done'+Math.random());
    },second);
})

}
async function bugDemo(){

let a =aa(1000);
let b =aa(1000);
let c =aa(1000);
await Promise.all([a,b,c])
console.log('clear the loading~');

}
bugDemo();

注意:await只能在async函数的上下文中。
async function forDemo(){

let arr = [1,2,3,4,5];
   for(let i=0;i<arr.length;i++){

await arr[i];
}
}
这个是正常的,不会报错。

async function forBugDemo(){
let arr = [1,2,3,4,5];
arr.forEach(item => {
await item;
});
}
这个会报错

相关推荐