美文网首页
async 注意要点

async 注意要点

作者: 幸宇 | 来源:发表于2020-03-25 21:54 被阅读0次

第一点,await命令后面的Promise对象,运行结果可能是rejected,所以最好把await命令放在try...catch代码块中。

async function myFunction() {
  try {
    await somethingThatReturnsAPromise();
  } catch (err) {
    console.log(err);
  }
}

// 另一种写法

async function myFunction() {
  await somethingThatReturnsAPromise()
  .catch(function (err) {
    console.log(err);
  };
}

第二点,多个await命令后面的异步操作,如果不存在继发关系,最好让它们同时触发。

let foo = await getFoo();
let bar = await getBar();

上面代码中,getFoo和getBar是两个独立的异步操作(即互不依赖),被写成继发关系。这样比较耗时,因为只有getFoo完成以后,才会执行getBar,完全可以让它们同时触发。

// 写法一
let [foo, bar] = await Promise.all([getFoo(), getBar()]);

// 写法二
let fooPromise = getFoo();
let barPromise = getBar();
let foo = await fooPromise;
let bar = await barPromise;

上面两种写法,getFoo和getBar都是同时触发,这样就会缩短程序的执行时间。

第三点,await命令只能用在async函数之中,如果用在普通函数,就会报错。

async function dbFuc(db) {
  let docs = [{}, {}, {}];

  // 报错
  docs.forEach(function (doc) {
    await db.post(doc);
  });
}

上面代码会报错,因为await用在普通函数之中了。但是,如果将forEach方法的参数改成async函数,也有问题。

async function dbFuc(db) {
  let docs = [{}, {}, {}];

  // 可能得到错误结果
  docs.forEach(async function (doc) {
    await db.post(doc);
  });
}

上面代码可能不会正常工作,原因是这时三个db.post操作将是并发执行,也就是同时执行,而不是继发执行。正确的写法是采用for循环。

async function dbFuc(db) {
  let docs = [{}, {}, {}];

  for (let doc of docs) {
    await db.post(doc);
  }
}

如果确实希望多个请求并发执行,可以使用Promise.all方法。

async function dbFuc(db) {
  let docs = [{}, {}, {}];
  let promises = docs.map((doc) => db.post(doc));

  let results = await Promise.all(promises);
  console.log(results);
}

// 或者使用下面的写法

async function dbFuc(db) {
  let docs = [{}, {}, {}];
  let promises = docs.map((doc) => db.post(doc));

  let results = [];
  for (let promise of promises) {
    results.push(await promise);
  }
  console.log(results);
}

ES6将await增加为保留字。使用这个词作为标识符,在ES5是合法的,在ES6将抛出SyntaxError。

------摘抄记录

相关文章

  • async 注意要点

    第一点,await命令后面的Promise对象,运行结果可能是rejected,所以最好把await命令放在try...

  • dispatch_barrier_async的注意事项

    dispatch_barrier_async 的注意是事项 使用 dispatch_barrier_async ,...

  • es6 async / await 使用经验总结

    async await使用的注意事项 async await注意 不能捕获Promise抛出的异常,所以我按下面的...

  • 笔记总结

    一、ES8(async/await)异步函数 ES8: async await 注意:async必须要去修饰一个函...

  • 注意要点

    1.注意义工身份,保持平和心,以温和态度沟通,拿资料后,可以先电话联系,确认走访时间 2.不要轻易向走访对象承诺,...

  • 网络爬虫(十三)

    协程移步执行 主要注意: 当作任务执行的函数前面要加async修饰。async def req(url): 在被当...

  • 2018-09-30 async.mapSeries的回调函数

    注意: callback(rs); 这样导致 async.mapSeries 只对 idarrays...

  • Async和Await

    1、概述 async(异步) 函数变体 以下是已经存在的异步函数变体。请注意无处不在的 async 关键字。 异步...

  • 5.AsyncTask注意事项

    注意事项: 参数: 不能在子线程生成Async实例 ASync中的Handler为静态变量,类加载的时候生成,如果...

  • springboot异步请求

    1.异步请求, 在异步类或方法上加@Async 注意:@Async注解的方法的返回类只能是void和Futur...

网友评论

      本文标题:async 注意要点

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