1.介绍promise和模仿Promise.all和Promise.race

promise的设计主要是解决回调地狱(接收结果用回调函数来处理,但必须传入回调函数)的问题,由一层层嵌套回调函数改为由then来执行。 例如:

 // callback用于接收返回结果, 异步方式fs.readFile("filePath", callback); // 还有一种方式cosnt { promises: fs } = require("fs"); // 用promise包装fs模块,已经实现fs.readFile("filePath").then(callback);// 由上可看出,promise只是解决了回调函数的调用方式,没有彻底改变回调函数继续存在的问题。复制代码

promise有三个状态,分别是pending, resolve,reject。只有resolve或者reject被调用,才会结束。 promise对象可以通过new创建, 结果返回后then和catch方法会调用,resolve和reject会走then方法,catch是捕捉未处理异常的方法(比如:500,404之类)。

值得注意的是,then方法的返回值为promise类型,如果在then中继续执行异步操作,则可以在then后面再次写一个then操作。叫做链式调用,例如:

  Promise.resolve("success").then((res) => "异步操作").then((resSecond) => console.log(resSecond)); // resSecond为“异步操作” 复制代码

另外可直接调用resolve状态或者reject状态,例如Promise.resolve(),或者Promise.reject()方法。这两个方法直接返回结果,也可以传入一个Promise对象或者工厂函数。这两个函数本质都是内部创建了一个Promise对象,调用resolve或者reject。

现如今很多的异步请求,异步执行方式,都在向promise靠拢。提供了很多的便利性。比如:axios,上面提到的fs模块,等等。我用过angular的subscribe,也是对异步的一种处理方式。但有点不伦不类。

1.1 模拟异步操作,用于测试

  // 模拟异步请求const suc = function (time: number) {return new Promise(resolve => {setTimeout(() => {// time秒钟之后返回结果resolve("success"); }, time);})}const rej = function (time: number) {return new Promise((resolve, reject) => {setTimeout(() => {// time秒之后拒绝reject("fail"); }, time);})}// 以上代码也可合并为一个函数,请读者自行考虑。复制代码

1.2 Promise的all,race方法模拟

PromiseAll方法内内只接受两个异步Promise,算是简化版了(官网api代码简介),能力有限。PromiseRace基本和官网上的差不多。

PromiseRace: 竞争性关系,获取第一个结果(无论结果resolve或者reject),立即返回。

PromiseAll_2:感觉使用状态控制这种不是太好啊

  // 准确来说,这个方法有缺陷,只要第一个返回,不管对与不对都返回,应该是所有结果都被reject掉才会返回reject,只有一个正确都要返回正确结果。可结合PromiseAll_2看function PromiseRace(arrs: Array): Promise<{}> {if (arrs.length === 0) return Promise.resolve([]);return new Promise((resolve, reject)=> {arrs.forEach((pro) => {Promise.resolve(pro).then(resolve, reject);});});}// 当所有结果为ture,才会返回turefunction isAllFulfilled(states: Array): boolean {let res: boolean = true;states.forEach(state => res = res && state)return res;}// 用一种循环的方式迭代每个异步方法,如果不是函数或对象就直接作为结果返回function PromiseAll_2(arrs: Array): Promise<{}> {if (arrs.length === 0) return Promise.resolve([]);const states: Array = Array.from({length: arrs.length}, (item) => item = false);return new Promise((resolve, reject)=> {const result = [];arrs.forEach((pro, index) => {// 对输入做一个封装,如果是常数或者不是promise的这样就直接返回Promise.resolve(pro).then(res => {states[index] = true;result[index] = res;if (isAllFulfilled(states)) resolve(result);}, err => reject(err));});});}function PromiseAll(one: Promise, two: Promise): Promise<{}> {return new Promise((resolve, reject) => {let twoRes = null;let oneRes = null;// 基于两个异步互相检测,官网那个有点看不大明白。各位有什么好的代码建议不妨评论说一下one.then((res) => {oneRes = res;if (twoRes) resolve([oneRes, twoRes]);}, (err) => reject(err));two.then((res) => {twoRes = res;if (oneRes) resolve([oneRes, twoRes]);}, (err) => reject(err));});}PromiseAll(suc(1000), rej(2000)).then((res) => {console.log(res);}).catch((err) => console.log(err));复制代码

1.3 小工具。

  1. 使用promisify对settimeout做个封装,单纯只是延迟执行
  const util  = require("util");// 封装settimeout延迟执行const delay = util.promisify(setTimeout); // 用作延迟执行,一般在await的时候用用例:async function test() {await delay(1000); // 延迟一秒执行 }复制代码
  1. async简单介绍
  async彻底解决了异步操作回调函数问题。只需使用await关键字,就会等待异步操作执行完毕才会继续执行后续代码。把异步操作变为同步操作。// 代码async function test() {const { data } = await axios.get("http://www.baidu.com"); // { data }为解构赋值// do something}// 不用asyncfunction test() {axios.get("http://www.baidu.com").then((res) => {console.log(res.data);//do something});}// 对比以上结构,async函数的同步会带来很大的方便,但在加载网页的时候可能需要等待。// 如果不希望页面卡顿,采用异步还是比较好的。复制代码

2. 每周分享

  1. 前端框架和es的一些变化,这里面介绍的是前端中最近的一些框架或者基础性知识。
  2. nginx的基础入门,对nginx的一个用法基本介绍。
  3. 阿里AI labs研发“智能防骚扰电话技术”,当接听到骚扰电话时,可以转到机器人接听。我试了一下,听得我一愣一愣的,还以为真的和人工客服聊天。具体想体验的可以在支付宝搜索天猫精灵。不过这项功能可能会给你带来困扰,如果你主动挂断电话,就会立马改为由智能机器人接听,如果是你女票打来的,你有事情马上挂断,后果不堪设想!好在可以关闭或者打开。玩玩可以,可不要贪杯啊。(>_<)

资料

  • MDN,关于peomise的解析
  • 官网api代码简介

对Promise的一些深入了解相关推荐

  1. setTimeout、setInterval、promise、async/await的顺序详解(多种情况,非常详细~)

    本文很长,列举的情况很多. 在阅读本文之前,如果您有充足的时间,请新建一个项目与本文一同实践. 每段代码都有对应的解释,但是自己动手尝试印象才会更深哦~ setInterval:表示多久执行一次,需要 ...

  2. C++多线程:异步操作std::async和std::promise

    文章目录 std::async 简介 使用案例 std::promise 简介 成员函数 总结 之前的文章中提到了C++多线程中的异步操作机制 C++ 多线程:future 异步访问类(线程之间安全便 ...

  3. ES6中的Promise详解

    Promise 在 JavaScript 中很早就有各种的开源实现,ES6 将其纳入了官方标准,提供了原生 api 支持,使用更加便捷. 定义 Promise 是一个对象,它用来标识 JavaScri ...

  4. 关于ES6中Promise的应用-顺序合并Promise,并将返回结果以数组的形式输出

    1.Promise 基础知识梳理 创建一个Promise实例 const promise = new Promise(function(resolve, reject) {if (success){r ...

  5. promise实现多个请求并行串行执行

    早上查资料,偶然发现这个话题,发现自己并不会,于是乎,下来研究了一下. 想想之前我们用jquery写请求的时候,要实现请求的串行执行,我们可能是这么做的. $.ajax({url: '',data: ...

  6. 异步编程之Promise(2):探究原理

    异步编程系列教程: (翻译)异步编程之Promise(1)--初见魅力 异步编程之Promise(2):探究原理 异步编程之Promise(3):拓展进阶 异步编程之Generator(1)--领略魅 ...

  7. 自己动手写cpu pdf_自己动手写 Promise

    这段时间在学习Promise,但始终不得要领.为了更好地理解Promise,我决定自己实现一个简易版的Promise,以学习Promise工作原理.该工程名为ToyPromise,仓库地址如下: ht ...

  8. promise 和 async await区别

     什么是Async/Await? async/await是写异步代码的新方式,以前的方法有回调函数和Promise. async/await是基于Promise实现的,它不能用于普通的回调函数. as ...

  9. Promise - js异步控制神器

    微信小程序开发交流qq群   581478349    承接微信小程序开发.扫码加微信. 正文: 首先给来一个简单的demo看看Promise是怎么使用的: <!DOCTYPE html> ...

  10. Promise的实例用法

    设定函数 function chiFan() {return new Promise(function(resolve, reject) {console.log("chiFan" ...

最新文章

  1. .NET中的密码学--对称加密
  2. 优秀的Java程序员应具备哪些编程技术?
  3. 程序员吐槽:去再好的互联网公司也就是个打工仔,还累出一身病
  4. [转] 如何在 CentOS7 中使用阿里云的yum源
  5. Tableau系列之圆环图制作
  6. 白话Elasticsearch40-深入聚合数据分析之案例实战_Global Aggregation:单个品牌与所有品牌平均价格对比
  7. Swift和Objective-C混编
  8. 小学数学里的必胜问题,在扑克牌游戏里的应用
  9. .NET与鲲鹏共展翅,昇腾九万里(一)
  10. 给定一个整数判断是否为素数_Ruby程序检查给定数字是否为素数
  11. kubernetes权威指南学习遇见的问题以及意见之二:Permission denied
  12. C++ 从入门到入土(English Version) Section 1:Gates, Circuits and Boolean Algebra
  13. SQL语句的优化建议
  14. macbook proc 如何设置touch bar 为F键
  15. 录制计算机课,ClassIn怎么录制视频 录课操作步骤
  16. python泰坦尼克号数据分析_利用python分析泰坦尼克号数据集
  17. 微信核酸检测预约小程序系统毕业设计毕设(6)开题答辩PPT
  18. Excel中的空值与数值比较
  19. 如何撤销Word文档的只读模式
  20. 关于计算机固态硬盘正确的是,如何对固态硬盘进行初始化?选择合适的格式及分区结构很重要...

热门文章

  1. php和js中,utf-8编码转成base64编码
  2. iOS App 崩溃报告符号化
  3. Hawk使用补充说明
  4. Linux下查看文件或文件夹大小的命令df 、du、ls
  5. ZendServer下安装Typecho需要注意问题
  6. /etc/syslog.conf文件作用
  7. 一个同步github上fork过来的项目的批处理脚本
  8. 添加非oracle用户到dba, oinstall组
  9. HDOJ_ACM_超级楼梯
  10. 面向对象设计原则之三:里氏替换原则