美文网首页
18async函数

18async函数

作者: 我_巨可爱 | 来源:发表于2017-11-08 10:31 被阅读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. 避免中断
    • 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();
    

    注意点

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

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

    相关文章

      网友评论

          本文标题:18async函数

          本文链接:https://www.haomeiwen.com/subject/opyjmxtx.html