博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
async/await 并行请求和错误处理
阅读量:7069 次
发布时间:2019-06-28

本文共 2278 字,大约阅读时间需要 7 分钟。

async 顺序

并发请求

使用async的时候,代码执行的顺序很容易出错,比如我们要同时发起两个请求,可能会写出下面的代码

function fetchName () {  return new Promise((resolve, reject) => {    setTimeout(() => {      resolve('lujs')    }, 3000)  })}function fetchAvatar () {  return new Promise((resolve, reject) => {    setTimeout(() => {      resolve('https://avatars3.githubusercontent.com/u/16317354?s=88&v=4')    }, 4000)  })}async fetchUser () {  const name = await fetchName()  const avatar = await fetchAvatar()  return {    name,    avatar  }}(async function () {  console.time('should be 7s ')  const user = await fetchUser()  console.log(user)  console.timeEnd('should be 3s ')})()

在上面的代码中,我们认为fetchName,fetchAvatar会并行执行,实际上并不会。fetchAvatar会等待fetchName执行完之后才开始请求。fetchUser函数的执行时间不是三秒而是7秒

要并行请求的话需要像下面这样写,fetchUserParallel的执行时间为4秒

async function fetchUserParallel () {  const namePromise = fetchName()  const avatarPromise = fetchAvatar()  return {    name: await namePromise,    avatar: await avatarPromise   }}(async function () {  console.time('should be 3s, but time is ')  const user = await fetchUser()  console.log(user)  console.timeEnd('should be 3s, but time is ')  console.time('should be 3s : ')  const user2 = await fetchUserParallel()  console.log(user2)  console.timeEnd('should be 3s : ')})()

使用Promise.all来并发请求

function fetchList (id) {  return new Promise((resolve, reject) => {    setTimeout(() => {      resolve(`id is : ${id}`)    }, 5000)  })}async function getList () {  const ary = [1, 2, 3, 4]  const list =  Promise.all(    ary.map(      (id) => fetchList(id)))  return await list}(async function () {  // 使用promise并发请求  console.time('should be 3s ')  const list = await getList()  console.log(list)  console.timeEnd('should be 3s ')})()

错误获取

使用try...catch

try {    const user3 = await fetchUser(true)  } catch (err) {    console.error('user3 error:', err)  }

包装promise,使其返回统一的格式的代码

/**   * 包装promise, 使其返回统一的错误格式   * @param {Promise} promise    */  function to (promise) {    return promise.then(res => [null, res]).catch(err => [err])  }  .  .  .  const [err, res] = await to(fetchUser(true))  if (err) {    console.error('touser err:', err)  }

继续使用catch

// 因为async 返回的promise对象,所以可以使用catch  const user4 = await fetchUser(true).catch(err => {    console.error('user4 error:', err)  })
有兴趣的可以用弄得运行一下代码,

转载地址:http://jwell.baihongyu.com/

你可能感兴趣的文章
什么是@guid
查看>>
nodeType的12种类型
查看>>
步步为营 .NET 代码重构学习笔记 十三
查看>>
053:Field的常用参数详解:
查看>>
读书笔记之SQL必知必会
查看>>
Jquery获取input表单的内容
查看>>
Paint、Canvas
查看>>
关于读写锁算法的java实现及思考
查看>>
最小堆排序
查看>>
iOS-网络爬虫
查看>>
jira
查看>>
elasticsearch rpm 安装
查看>>
Python基础总结(字符串常用,数字类型转换,基本运算符与流程控制)
查看>>
数据预处理——剔除异常值,平滑,归一化
查看>>
Visual stuido 项目路径的奇怪问题
查看>>
java局部变量和临时变量
查看>>
返回杨辉三角前 n 层的数字
查看>>
布局(2、相对布局)
查看>>
在 Eclipse 上配置tomcat7.0并创建工程发布
查看>>
腾讯移动分析 签名代码示例
查看>>