18async函数

2017-11-08  本文已影响0人  我_巨可爱

和 Generator 区别

  1. 内置执行器,不必使用next等语法,像普通函数的调用一样,调用 async 函数
  2. 使用async等语法,更清晰
  3. await可以是 Promise 对象,可以是 普通类型。co模块约定,yield命令后面只能是 Thunk 函数或 Promise 对象
  4. 返回值是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)
})
  1. 语法asyncawait
  2. await 会将非 Promise 对象包裹成 resolved 状态的 Promise对象
  3. 只有异步执行完成,才会执行下一步
  4. async函数返回的是promise 对象
  5. 感觉就像将 异步执行 装换成 同步执行

语法

  1. 返回的Promise对象,当async函数执行完毕,才会then
  2. await后promise为reject状态,会立刻中断async函数执行,并执行调用方法后的catch
  3. 避免中断
// 多次尝试
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();

注意点

以下注意点,可以处理错误,提高性能

  1. 多个await语句放在try-catch语句中
  2. await后语句,如果不存在继发关系(等a执行完再执行b),那么让它们同时触发
  3. 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()
})
上一篇下一篇

猜你喜欢

热点阅读