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)
})
复制代码

关键点

  1. resolve 和 reject为内置函数,then函数内部是回调函数(可分别接受resolve和reject的回调),resolve和reject可以分别传参给这两个函数。
  2. 举一个可以解决请求的回调嵌套的例子
const p1 = new Promise(function(resolve,reject){....
})
const p2 = new Promise(function(resolve,reject){resolve(p1)
})复制代码
  1. p2的执行依赖于p1的执行结果。
  2. resolve或者reject并不会阻止promise内部剩余其他代码的执行。
  3. promise.then返回一个新的promise对象,可以链式调用。像二中的代码可以写成promise.then().then().then()...的形式。
  4. 错误处理(reject状态处理),catch方法里处理更加推荐(语义化)。
// bad
promise.then(function(data) {// success}, function(err) {// error});// good
promise.then(function(data) { //cb// success}).catch(function(err) {// error});
复制代码
  1. 另外还有两个很有用的方法:
//promise.all:所有请求同时发送,都成功之后resolve。
// 多个请求可以同时处理时候性能提升显著
promise.all([p1,p2,p3],function{})
// 第一个成功之后resolve,并且回调函数返回一个基于该成功的promise对象。
promise.race复制代码

不足之处

  1. 一旦开始无法结束
  2. 会吃掉错误,如果没有相应回调来处理错误,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'); // 不会执行
}
复制代码

解决办法:

  1. 在内部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
复制代码
  1. 可能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);}
}
复制代码
  1. 灵活应用promise.all进行并行处理,提升性能

转载于:https://juejin.im/post/5a7d17516fb9a063491291fa

promise async 学习笔记相关推荐

  1. ES6基础5(Promise)-学习笔记

    文章目录 ES6基础5(Promise)-学习笔记 Promise 三个状态 状态转换 手写Promise源码 同步异步概念 jquery中 串行并行 async-await 微任务 宏任务 ES6基 ...

  2. 十二、Promise的学习笔记(Promise的基本使用、链式编程、all())

    一.认识Promise ES6中一个非常重要和好用的特性就是Promise 但是初次接触Promise会一脸懵逼,这TM是什么东西? 看看官方或者一些文章对它的介绍和用法,也是一头雾水. Promis ...

  3. jquery设置宽_JavaScript学习笔记(三十二) jQuery(中)

    jQuery 昨天讲了 jQuery 的基本选择器筛选器和属性操作 今天来说一些 jQuery 别的东西 元素操作 创建一个元素 var div = $(') 内部插入元素 // 向 div 元素中插 ...

  4. 【学习笔记】Part1·JavaScript·深度剖析-函数式编程与 JS 异步编程、手写 Promise(二、JavaScript 异步编程)

    [学习笔记]Part1·JavaScript·深度剖析-函数式编程与 JS 异步编程.手写 Promise(课前准备) [学习笔记]Part1·JavaScript·深度剖析-函数式编程与 JS 异步 ...

  5. C# async await 学习笔记2

    C# async await 学习笔记1(http://www.cnblogs.com/siso/p/3691059.html) 提到了ThreadId是一样的,突然想到在WinForm中,非UI线程 ...

  6. 多线程编程学习笔记——async和await(三)

    接上文 多线程编程学习笔记--async和await(一) 接上文 多线程编程学习笔记--async和await(二) 五.   处理异步操作中的异常 本示例学习如何在异步函数中处理异常,学习如何对多 ...

  7. JavaScript:学习笔记(9)——Promise对象

    JavaScript:学习笔记(9)--Promise对象 引入Promise Primose是异步编程的一种解决方案,比传统的解决方案回调函数和事件更加合理和强大.如下面为基于回调函数的Ajax操作 ...

  8. Promise学习笔记(一)

    Promise学习笔记(一) 个人博客:Promise学习笔记(一) 一直有在用Promise,但是没有系统学过Promise,自然也不知道原理.现在就来学习一波. 1. 介绍 Promise是JS中 ...

  9. Puppeteer 学习笔记及基本用法

    Puppeteer 学习笔记及基本用法 Puppeteer 安装 语法 基本语法 API 分层结构 加载导航页面 等待元素.请求.响应 自定义等待 元素定位 用户模拟操作 请求拦截 获取 WebSoc ...

最新文章

  1. SQL Server的WAITFOR DELAY注入
  2. expect实现自动登录
  3. hdu1521 排列组合
  4. POJ 1860 Currency Exchange
  5. Unity3D学习(五):实现一个简单的视觉感知
  6. d630 无线驱动 linux,fedora 8下DELL D630无线网卡驱动的安装
  7. Oracle数据库常用sql语句
  8. 【学习】FaceForensics++: Learning to Detect Manipulated Facial Images
  9. Excel使用VBA动态设置打印区域
  10. 阿里巴巴编程规范(new)
  11. CDH 端口未授权访问:hdfs-50070, yarn-8088, jetty漏洞修复
  12. 域服务器用户一直被锁,Windows Server 2019 域用户账户锁定策略
  13. PermissionError: [WinError 5] 拒绝访问。: ‘E:\\IdeaProjects\\maintenance\\dist\\main‘
  14. 三菱伺服电机编码器故障判断方法
  15. 【遥感图像应用实例】利用多波段(光谱)数据区分真实草地和人造草地
  16. Effective C++ 学习笔记 第七章:模板与泛型编程
  17. 高项论文分析——论项目的质量管理
  18. linux etc fstab 重启,如何重新挂载/etc/fstab而无须重启
  19. 教你利用python画画
  20. switch开关点击无效的解决办法:element中switch v-model绑定的值为数字类型情形

热门文章

  1. js调用python脚本_javascript – 如何从NodeJs调用python脚本
  2. jq onclick 定义_从HTML中的onClick属性调用jQuery方法
  3. jradiobutton设置默认选项_JRadioButton(单选按钮)添加事件监听
  4. php开发的程序怎么用加密狗加密,C# 简单的程序绑定、加密(类似加密狗)
  5. 通过一个端口读取多个按钮
  6. 2021年春季学期-信号与系统-第十五次作业参考答案-第七小题参考答案
  7. 2021年春季学期-信号与系统-第八次作业参考答案-第十一小题
  8. 大咖云集!航天智慧物流创意组-技术培训第三期
  9. 海军工程大学学生电子课程-DIY Final预验收
  10. 光敏电阻与光强之间什么关系?