热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Promise、Generator和async踩坑记

目录1、Promise两种容易混淆的用法2、try-catch能不能抛出promise的异常?3、forEach中使用async的踩坑ES6异步处理之Promise对


目录

    • 1、Promise 两种容易混淆的用法
    • 2、try-catch 能不能抛出 promise 的异常?
    • 3、forEach 中使用 async 的踩坑



ES6 异步处理之 Promise 对象、Generator 函数 与 async 函数基础详解


1、Promise 两种容易混淆的用法


  • 在有回调函数的方法中

import request from 'request';const getThirdData = async(url, requestData) => {return new Promise((resolve, reject) => {request.post({url,method: "POST",json: false,headers: {"content-type": "application/json",},body: JSON.stringify(requestData)}, (error, response, body) => {// 回调函数error ? reject(error) : resolve(body);})})
}

  • 在没有回调函数的方法中

export const getApiListByType = (projectName) => {return new Promise((resolve, reject) => {fetch( url, {method: 'GET',mode: 'cors',credentials: 'include'}).then(res => resolve(res.json())).catch(err => reject(err))})
}



2、try-catch 能不能抛出 promise 的异常?

try-catch 主要用于捕获异常,注意,这里的异常,是指同步函数的异常,如果 try 里面的异步方法出现了异常,此时catch 是无法捕获到异常的,原因是因为:当异步函数抛出异常时,对于宏任务而言,执行函数时已经将该函数推入栈,此时并不在 try-catch 所在的栈,所以 try-catch 并不能捕获到错误。对于微任务而言,比如 promise,promise 的构造函数的异常只能被自带的 reject 也就是.catch 函数捕获到。

下面举两个例子说明:

// 异步,宏任务
try {setTimeout(function() {console.log(b);}, 0);
} catch (error) {console.log(error); // 这里是不会执行的
}
console.log('out try catch');

// 异步,微任务
try {new Promise(() => {throw new Error('new promise throw error');});
} catch (error) {console.log(error);
}

解决方案:


  • 同步任务:try…catch 就够了。
  • 异步任务:try…catch 结合 promise 的 catch() 方法一起使用。


3、forEach 中使用 async 的踩坑

错误再现:

const updateDataById = ctx => {const { list, id } = ctx.query;let result = null;try {result = list.forEach(async type => {await this.update({ id });})} catch (error) {result = {'error': error};}ctx.body = result;
}

解决方案:Promise.all() + map() 代替 forEach()

const updateDataById = async(ctx) => {const { list, id } = ctx.query;let result = null;try {await Promise.all(list.map(async type => {return await this.update({ id });})).then(data => result = data}).catch(error => result = error)} catch (error) {result = {'error': error};}ctx.body = result;
}

为什么这样改就可以了呢?
forEach与async/await使用踩坑
理解和使用Promise.all和Promise.race





参考文档:
try-catch 能抛出 promise 的异常吗
forEach与async/await使用踩坑


推荐阅读
  • 本文深入探讨了HTTP请求和响应对象的使用,详细介绍了如何通过响应对象向客户端发送数据、处理中文乱码问题以及常见的HTTP状态码。此外,还涵盖了文件下载、请求重定向、请求转发等高级功能。 ... [详细]
  • 本文详细介绍了如何使用 Yii2 的 GridView 组件在列表页面实现数据的直接编辑功能。通过具体的代码示例和步骤,帮助开发者快速掌握这一实用技巧。 ... [详细]
  • 使用 Azure Service Principal 和 Microsoft Graph API 获取 AAD 用户列表
    本文介绍了一段通用代码示例,该代码不仅能够操作 Azure Active Directory (AAD),还可以通过 Azure Service Principal 的授权访问和管理 Azure 订阅资源。Azure 的架构可以分为两个层级:AAD 和 Subscription。 ... [详细]
  • 探讨如何正确使用 Fetch API 进行参数传递,分析不同写法的差异及解决方案。 ... [详细]
  • Explore a common issue encountered when implementing an OAuth 1.0a API, specifically the inability to encode null objects and how to resolve it. ... [详细]
  • 深入解析Spring Cloud Ribbon负载均衡机制
    本文详细介绍了Spring Cloud中的Ribbon组件如何实现服务调用的负载均衡。通过分析其工作原理、源码结构及配置方式,帮助读者理解Ribbon在分布式系统中的重要作用。 ... [详细]
  • 扫描线三巨头 hdu1928hdu 1255  hdu 1542 [POJ 1151]
    学习链接:http:blog.csdn.netlwt36articledetails48908031学习扫描线主要学习的是一种扫描的思想,后期可以求解很 ... [详细]
  • 本文详细探讨了VxWorks操作系统中双向链表和环形缓冲区的实现原理及使用方法,通过具体示例代码加深理解。 ... [详细]
  • PHP 过滤器详解
    本文深入探讨了 PHP 中的过滤器机制,包括常见的 $_SERVER 变量、filter_has_var() 函数、filter_id() 函数、filter_input() 函数及其数组形式、filter_list() 函数以及 filter_var() 和其数组形式。同时,详细介绍了各种过滤器的用途和用法。 ... [详细]
  • PHP 编程疑难解析与知识点汇总
    本文详细解答了 PHP 编程中的常见问题,并提供了丰富的代码示例和解决方案,帮助开发者更好地理解和应用 PHP 知识。 ... [详细]
  • 深入理解Tornado模板系统
    本文详细介绍了Tornado框架中模板系统的使用方法。Tornado自带的轻量级、高效且灵活的模板语言位于tornado.template模块,支持嵌入Python代码片段,帮助开发者快速构建动态网页。 ... [详细]
  • PHP 5.2.5 安装与配置指南
    本文详细介绍了 PHP 5.2.5 的安装和配置步骤,帮助开发者解决常见的环境配置问题,特别是上传图片时遇到的错误。通过本教程,您可以顺利搭建并优化 PHP 运行环境。 ... [详细]
  • 在使用 DataGridView 时,如果在当前单元格中输入内容但光标未移开,点击保存按钮后,输入的内容可能无法保存。只有当光标离开单元格后,才能成功保存数据。本文将探讨如何通过调用 DataGridView 的内置方法解决此问题。 ... [详细]
  • 本文探讨了在 Vue 2.0 项目中使用 Axios 获取数据时可能出现的错误,并提供详细的解决方案和最佳实践。 ... [详细]
  • 深入理解Redis的数据结构与对象系统
    本文详细探讨了Redis中的数据结构和对象系统的实现,包括字符串、列表、集合、哈希表和有序集合等五种核心对象类型,以及它们所使用的底层数据结构。通过分析源码和相关文献,帮助读者更好地理解Redis的设计原理。 ... [详细]
author-avatar
拍友2502904975
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有