const fn = async () =>{const res1 = await fn1();const res2 = await fn2();console.log(res1);// 1console.log(res2);// 2}//并发请求const fn = () =>{Promise.all([fn1(),fn2()]).then(res =>{console.log(res);// [1,2]})}// Promise.race 其中一个成功就返回
async….awiat相对应
async函数返回一个 Promise 对象,可以使用then方法添加回调函数。
当函数执行的时候,一旦遇到await就会先返回,等到异步操作完成,再接着执行函数体内后面的语句。
async function getStockPriceByName(name) {const symbol = await getStockSymbol(name);const stockPrice = await getStockPrice(symbol);return stockPrice;}getStockPriceByName('goog').then(function (result) {console.log(result);});
- async函数内部return语句返回的值,会成为then方法回调函数的参数。
- async函数内部抛出错误,会导致返回的 Promise 对象变为reject状态。抛出的错误对象会被catch方法回调函数接收到。
- async函数返回的 Promise 对象,必须等到内部所有await命令后面的 Promise 对象执行完,才会发生状态改变,除非遇到return语句或者抛出错误。只有async函数内部的异步操作执行完,才会执行then方法指定的回调函数。 (简单而言 全部执行完,或者报错了,才会执行then)
await命令后面是一个 Promise 对象,返回该对象的结果。如果不是 Promise 对象,就直接返回对应的值async function getTitle(url) {let response = await fetch(url);let html = await response.text();return html.match(/<title>([\s\S]+)<\/title>/i)[1];}getTitle('https://tc39.github.io/ecma262/').then(console.log)// "ECMAScript 2017 Language Specification"
```javascript //休眠,定义sleep ,在异步执行时,使用await进行等待时候的休眠 function sleep(interval) { return new Promise(resolve => { setTimeout(resolve, interval); }) }
// 用法 async function one2FiveInAsync() { for(let i = 1; i <= 5; i++) { console.log(i); await sleep(1000); } }
one2FiveInAsync();
await命令后面的Promise对象,运行结果可能是rejected,所以最好把await命令放在**try...catch**代码块中 <br />同时await 后面异步操作函数,在不存在继发关系的情况下,最好**同时触发**```javascript//try catchasync function myFunction() {try {await somethingThatReturnsAPromise();} catch (err) {console.log(err);}}// 另一种写法async function myFunction() {await somethingThatReturnsAPromise().catch(function (err) {console.log(err);});}------------------------------------------------------------在两个异步操作不存在异步操作时,这么写变成继发关系,会比较耗时let foo = await getFoo();let bar = await getBar();同时触发// 写法一let [foo, bar] = await Promise.all([getFoo(), getBar()]);// 写法二let fooPromise = getFoo();let barPromise = getBar();let foo = await fooPromise;let bar = await barPromise;
