和 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()
})













网友评论