promise async 学习笔记
promise and async
js设计初衷是应用于浏览器端,为了避免用户交互时候的冲突,js是单线程的,为了解决js中的很多异步场景的问题。
//最常见的一种回调的嵌套:---回调地狱
doAsyncJob1(function(){
doAsyncJob2(function(){doAsyncJob3(function(){doAsyncJob4(function(){//Black hole });}) });});复制代码
es6以及之后提案提出了几个解决方案。以下是对这几个异步解决方案的简单理解。
promise
promise 类似于不可逆的状态机。只能pengding到fulfilled或者到rejected。
const promise = new Promise(function(resolve, reject) {// ... some codeif (/* 异步操作成功 */){resolve(value);} else {reject(error);}
});
promise.then(function(value){console.log(value)
},function(error){console.log(error)
})
复制代码
关键点
- resolve 和 reject为内置函数,then函数内部是回调函数(可分别接受resolve和reject的回调),resolve和reject可以分别传参给这两个函数。
- 举一个可以解决请求的回调嵌套的例子
const p1 = new Promise(function(resolve,reject){....
})
const p2 = new Promise(function(resolve,reject){resolve(p1)
})复制代码
- p2的执行依赖于p1的执行结果。
- resolve或者reject并不会阻止promise内部剩余其他代码的执行。
- promise.then返回一个新的promise对象,可以链式调用。像二中的代码可以写成promise.then().then().then()...的形式。
- 错误处理(reject状态处理),catch方法里处理更加推荐(语义化)。
// bad
promise.then(function(data) {// success}, function(err) {// error});// good
promise.then(function(data) { //cb// success}).catch(function(err) {// error});
复制代码
- 另外还有两个很有用的方法:
//promise.all:所有请求同时发送,都成功之后resolve。
// 多个请求可以同时处理时候性能提升显著
promise.all([p1,p2,p3],function{})
// 第一个成功之后resolve,并且回调函数返回一个基于该成功的promise对象。
promise.race复制代码
不足之处
- 一旦开始无法结束
- 会吃掉错误,如果没有相应回调来处理错误,promise错误不会传递到外层。
async
async 是js实现异步的另一种方式,本质上是generate函数的语法糖。 它返回一个promise对象,可以调用then方法对返回的内容进行处理。gennerate需要手动调用一个指向内部的指针,来进行异步操作(详见),而async则不用。
//
const asyncReadFile = async function () {const f1 = await readFile('/etc/fstab');//等我执行完const f2 = await readFile('/etc/shells');//等我也执行完再打印console.log(f1.toString());console.log(f2.toString());
};
复制代码
函数内部await引导的异步操作会同步执行。async函数返回一个promise对象,可以使用then对返回值进行处理,错误处理也同promise。
await命令
await命令后边是一个promise对象,如果不是那就会被转化成一个状态为resolve的promise对象。
错误处理以及使用注意
async function f() {await Promise.reject('出错了');await Promise.resolve('hello world'); // 不会执行
}
复制代码
解决办法:
- 在内部catch(err);
async function f() {await Promise.reject('出错了').catch(e => console.log(e));return await Promise.resolve('hello world');
}f()
.then(v => console.log(v))
// 出错了
// hello world
复制代码
- 可能reject的代码写在try,catch中。
async function main() {try {const val1 = await firstStep();const val2 = await secondStep(val1);const val3 = await thirdStep(val1, val2);console.log('Final: ', val3);}catch (err) {console.error(err);}
}
复制代码
- 灵活应用promise.all进行并行处理,提升性能
转载于:https://juejin.im/post/5a7d17516fb9a063491291fa
promise async 学习笔记相关推荐
- ES6基础5(Promise)-学习笔记
文章目录 ES6基础5(Promise)-学习笔记 Promise 三个状态 状态转换 手写Promise源码 同步异步概念 jquery中 串行并行 async-await 微任务 宏任务 ES6基 ...
- 十二、Promise的学习笔记(Promise的基本使用、链式编程、all())
一.认识Promise ES6中一个非常重要和好用的特性就是Promise 但是初次接触Promise会一脸懵逼,这TM是什么东西? 看看官方或者一些文章对它的介绍和用法,也是一头雾水. Promis ...
- jquery设置宽_JavaScript学习笔记(三十二) jQuery(中)
jQuery 昨天讲了 jQuery 的基本选择器筛选器和属性操作 今天来说一些 jQuery 别的东西 元素操作 创建一个元素 var div = $(') 内部插入元素 // 向 div 元素中插 ...
- 【学习笔记】Part1·JavaScript·深度剖析-函数式编程与 JS 异步编程、手写 Promise(二、JavaScript 异步编程)
[学习笔记]Part1·JavaScript·深度剖析-函数式编程与 JS 异步编程.手写 Promise(课前准备) [学习笔记]Part1·JavaScript·深度剖析-函数式编程与 JS 异步 ...
- C# async await 学习笔记2
C# async await 学习笔记1(http://www.cnblogs.com/siso/p/3691059.html) 提到了ThreadId是一样的,突然想到在WinForm中,非UI线程 ...
- 多线程编程学习笔记——async和await(三)
接上文 多线程编程学习笔记--async和await(一) 接上文 多线程编程学习笔记--async和await(二) 五. 处理异步操作中的异常 本示例学习如何在异步函数中处理异常,学习如何对多 ...
- JavaScript:学习笔记(9)——Promise对象
JavaScript:学习笔记(9)--Promise对象 引入Promise Primose是异步编程的一种解决方案,比传统的解决方案回调函数和事件更加合理和强大.如下面为基于回调函数的Ajax操作 ...
- Promise学习笔记(一)
Promise学习笔记(一) 个人博客:Promise学习笔记(一) 一直有在用Promise,但是没有系统学过Promise,自然也不知道原理.现在就来学习一波. 1. 介绍 Promise是JS中 ...
- Puppeteer 学习笔记及基本用法
Puppeteer 学习笔记及基本用法 Puppeteer 安装 语法 基本语法 API 分层结构 加载导航页面 等待元素.请求.响应 自定义等待 元素定位 用户模拟操作 请求拦截 获取 WebSoc ...
最新文章
- SQL Server的WAITFOR DELAY注入
- expect实现自动登录
- hdu1521 排列组合
- POJ 1860 Currency Exchange
- Unity3D学习(五):实现一个简单的视觉感知
- d630 无线驱动 linux,fedora 8下DELL D630无线网卡驱动的安装
- Oracle数据库常用sql语句
- 【学习】FaceForensics++: Learning to Detect Manipulated Facial Images
- Excel使用VBA动态设置打印区域
- 阿里巴巴编程规范(new)
- CDH 端口未授权访问:hdfs-50070, yarn-8088, jetty漏洞修复
- 域服务器用户一直被锁,Windows Server 2019 域用户账户锁定策略
- PermissionError: [WinError 5] 拒绝访问。: ‘E:\\IdeaProjects\\maintenance\\dist\\main‘
- 三菱伺服电机编码器故障判断方法
- 【遥感图像应用实例】利用多波段(光谱)数据区分真实草地和人造草地
- Effective C++ 学习笔记 第七章:模板与泛型编程
- 高项论文分析——论项目的质量管理
- linux etc fstab 重启,如何重新挂载/etc/fstab而无须重启
- 教你利用python画画
- switch开关点击无效的解决办法:element中switch v-model绑定的值为数字类型情形
热门文章
- js调用python脚本_javascript – 如何从NodeJs调用python脚本
- jq onclick 定义_从HTML中的onClick属性调用jQuery方法
- jradiobutton设置默认选项_JRadioButton(单选按钮)添加事件监听
- php开发的程序怎么用加密狗加密,C# 简单的程序绑定、加密(类似加密狗)
- 通过一个端口读取多个按钮
- 2021年春季学期-信号与系统-第十五次作业参考答案-第七小题参考答案
- 2021年春季学期-信号与系统-第八次作业参考答案-第十一小题
- 大咖云集!航天智慧物流创意组-技术培训第三期
- 海军工程大学学生电子课程-DIY Final预验收
- 光敏电阻与光强之间什么关系?