18async函数
2017-11-08 本文已影响0人
我_巨可爱
和 Generator 区别
- 内置执行器,不必使用
next
等语法,像普通函数的调用一样,调用 async 函数 - 使用
async
等语法,更清晰 -
await
可以是 Promise 对象,可以是 普通类型。co模块约定,yield命令后面只能是 Thunk 函数或 Promise 对象 - 返回值是
Promise
对象
简单案例
async function getStockPrice(name) {
let stockSymbol = await getStockSymbol(name)
let stockPrice = await getPrice(stockSymbol)
return stockPrice
}
getStockPrice('ggoo').then(function (price) {
console.log(price)
}).catch(function (e){
console.log(e)
})
- 语法
async
和await
-
await
会将非Promise
对象包裹成 resolved 状态的Promise
对象 - 只有异步执行完成,才会执行下一步
-
async
函数返回的是promise 对象 - 感觉就像将 异步执行 装换成 同步执行
语法
- 返回的Promise对象,当
async
函数执行完毕,才会then
-
await
后promise为reject
状态,会立刻中断async
函数执行,并执行调用方法后的catch
- 避免中断
- 将
await
语句放到try-catch
中 -
await
后的promise
对象添加上catch
方法
// 多次尝试
const superagent = require('superagent');
const NUM_RETRIES = 3;
async function test() {
let i;
for (i = 0; i < NUM_RETRIES; ++i) {
try {
await superagent.get('http://google.com/this-throws-an-error');
break;
} catch(err) {}
}
console.log(i); // 3
}
test();
注意点
以下注意点,可以处理错误,提高性能
- 多个
await
语句放在try-catch
语句中 -
await
后语句,如果不存在继发关系(等a执行完再执行b),那么让它们同时触发 -
await
只能用在async
函数中
// 同时触发 --- 方法一
let [foo,bar] =await Promise.all([getFoo(),getBar()])
// 同时触发 --- 方法二
let foo = getFoo()
let bar = getBar()
await foo
await bar
按顺序完成异步操作
如果使用,for,那么将是继发。可以使用
map
const textPromises = urls.map(async function (url) {
// 这里边是继发,但是外部的map不是
const response = awatit(url)
return response.text()
})