一、promise

promise的概念

Promise 是异步编程的一种解决方案,是一个构造函数,自身有all、reject、resolve方法,原型上有then、catch等方法。

特点:

  • 对象的状态不受外界影响。Promise对象代表一个异步操作,有三种状态:pending(进行中)、fulfilled(已成功)和rejected(已失败)

  • 一旦状态改变,就不会再变,任何时候都可以得到这个结果。Promise对象的状态改变,只有两种可能:从pending变为fulfilled和从pending变为rejected。

一句话总结:就是用来解决地域回调问题(地域回调--回调函数里面嵌套回调函数)

promise使用方法

用法一:Promise构造函数接受一个函数作为参数,该函数的两个参数分别是resolve和reject。它们是两个函数,由JavaScript引擎提供。

resolve函数的作用是,将Promise对象的状态从“未完成”变为“成功”(即从Pending变为Resolved),在异步操作成功时调用,并将异步操作的结果作为参数传递出去。

reject函数的作用是,将Promise对象的状态从“未完成”变为“失败”(即从Pending变为Rejected),在异步操作失败时调用,并将异步操作报出的错误作为参数传递出去。

用法二:Promise.resolve() 和 Promise.reject() 可以直接被调用。有时候,当判断出 promise 并不需要真正执行时,我们并不需要 使用 new 创建 Promise 对象,而是可以直接调用 Promise.resolve() 和 Promise.reject()。

地狱回调的例子

回调地狱是为了让我们代码执行顺序的一种操作(解决异步),但是它会使我们的可读性非常差。

//地狱回调
setTimeout(function () { //第一层console.log('小锁'); //等3秒打印张三在执行下一个回调函数setTimeout(function () { //第二层console.log('李四'); //等2秒打印李四在执行下一个回调函数setTimeout(function () { //第三层console.log('王五'); //等一秒打印王五}, 1000)}, 2000)
}, 3000)

promise解决地域回调

function resolveCallback(name, flag = true) {return new Promise((resolve, reject) => {// 处理异步任务setTimeout(() => {if (flag) {resolve(name)} else {reject('失败')}}, 1000)}, )
}
resolveCallback('张三').then(res => {console.log(res)return resolveCallback('李四')
}).then(res => {console.log(res)return resolveCallback('王五')
}).then(res => {console.log(res)
}).catch(res => { //捕捉失败的回调结果console.log(res)
})

Promise.all()方法

Promise.all([ .. ]) 接受一个或多个值的数组(比如,立即值、promise、thenable)。它返回一个promise。

如果所有的值都完成,这个promise 的结果是完成;

一旦它们中的某一个被拒绝,那么这个promise 就立即被拒绝。

let p1 = resolveCallback('张三')
let p2 = resolveCallback('李四')
let p3 = resolveCallback('王五')
let p = Promise.all([p1,p2,p3]).then(res=>{console.log(res)
}).catch(res=>{console.log('失败')
})

Promise.race 方法

Promise.race() 函数返回一个 Promise,它将与第一个传递的 promise 相同的完成方式被完成。它可以是完成( resolves),也可以是失败(rejects),这要取决于第一个完成的方式是两个中的哪个。

let p1 = resolveCallback('张三', 2)
let p2 = resolveCallback('李四', 3)
let p3 = resolveCallback('王五', 1)
let p = Promise.race([p1, p2, p3]).then(res => {console.log(res)
}).catch(res => {console.log('失败')
})

二、async

async的概念

  1. Async/Await 代码看起来简洁一些,使得异步代码看起来像同步代码

  1. async函数一定会返回一个promise对象。如果一个async函数的返回值看起来不是promise,那么它将会被隐式地包装在一个promise中。

  1. sync await是基于Promise实现的,可以说是改良版的Promise,它不能用于普通的回调函数。

async 函数中 return 值如何接收?

  • 方式一:通过 promise.then形参获取

  • 方式二:接受函数返回值的方式是 await

await的作用

await关键字的作用 就是获取 Promise中返回的内容, 获取的是Promise函数中resolve或者reject的值(await 作用是获取promise.[[promiseValue]]的值)

关于await的注意点

(1)await 必须写在 async 中

(2)await 后是一个promise实例对象

三、为什么async/await更好?

  • 使用async函数可以让代码简洁很多

  • 不需要像Promise一样需要then

  • 不需要写匿名函数处理Promise的resolve的值

  • 也不需要定义多余的data变量,还避免了嵌套代码

promise和async用法及区别(详解)相关推荐

  1. python cut函数_基于python cut和qcut的用法及区别详解

    我就废话不多说了,直接上代码吧: from pandas import Series,DataFrame import pandas as pd import numpy as np from num ...

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

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

  3. MySQL中索引与视图的用法与区别详解

    索引与视图是我们在日常使用mysql必不可少的一部分,最近在学习中看到一本书中关于这方法写的不错,所以这篇文章主要给大家介绍了关于MySQL中索引与视图的使用与区别的相关资料,需要的朋友可以参考借鉴, ...

  4. keydown、keypress与keyup用法及区别详解

    定义和用法 - [keydown - 键按下的过程](https://www.runoob.com/jquery/event-keydown.html) 当键盘键被按下时发生 keydown 事件. ...

  5. 【pytorch】model.train和model.eval用法及区别详解

    使用PyTorch进行训练和测试时一定注意要把实例化的model指定train/eval,eval()时,框架会自动把BN和DropOut固定住,不会取平均,而是用训练好的值,不然的话,一旦test的 ...

  6. php 点号 的用法,基于php中echo用逗号和用点号的区别详解

    php 的 基于php中echo用逗号和用点号的区别详解 实例如下: echo 1+5; echo " "; echo '1+5='."1+5"." ...

  7. [ASP.NET]ASP.NET中的Inherits、CodeFile、CodeBehind的区别详解及OWIN及IDENTITY

    篇一 : ASP.NET中的Inherits.CodeFile.CodeBehind的区别详解 Inherits.CodeFile.CodeBehind 在 ASP.NET 中使用代码隐藏方法来设计W ...

  8. es6 --- promise和async/await的区别

    首先需要了解async函数: async是Generator函数的语法糖: // 使用Generator依次读取两个文件 var fs = require('fs'); var readFile = ...

  9. linux中cat、more、less命令区别详解

    linux中cat.more.less命令区别详解 转自:https://blog.csdn.net/xyw_blog/article/details/16861681 众所周知linux中命令cat ...

最新文章

  1. Bug tracker .net 部署经验(完善中)
  2. 掌握 Ajax,第 10 部分: 使用 JSON 进行数据传输
  3. ABAP OO的八大理由
  4. odp.net连接oracle9i 出错解决_机电工程老出错?机电安装质量通病防治手册,解决常见多发问题...
  5. Github continuous deployment (CD) 最佳实践
  6. jax-rs jax-ws_什么是JAX-RS注释? (第3部分)
  7. Java面试题:单例设计模式、适配器模式的不同方式
  8. linux命令wget下载jdk(完整解决诸多异常)
  9. 最牛逼的微服务架构方案,没有之一!
  10. STM32学习笔记(7):USART串口的使用
  11. 【算法导论】指针作为形式参数时 改变指针所指的值(二叉排序树)
  12. 1秒替换视频背景,阿里AI获CVPR 2020四项世界冠军
  13. 『不再迷茫 - 正则表达式』JS正则要点梳理 持续更新
  14. Robocode 直线瞄准机器人
  15. TLSF算法2:位图的相关计算
  16. 项目开发设计文档怎么写,范文。
  17. win7系统计算机找不到u盘启动,联想f12后没有u盘启动怎么办_联想f12没有usb启动项如何解决-win7之家...
  18. 蓝桥杯试题 基础练习 圆的面积_python_个人练习
  19. Tafel 曲线绘制
  20. 查看MySQL初始密码并修改

热门文章

  1. Python 超简单爬取微博热搜榜数据
  2. 凸函数高维性质证明(Jenson不等式)
  3. 程序的与时俱进之一——面向接口编程
  4. 1.Hue 中运行oozie工作流执行spark 报错 local class incompatible
  5. php的标准输入与输出
  6. 宇宙最简单排序:桶排序
  7. PS Suite Studio Android 调试方法
  8. DayDayUp:五四青年节快乐!献给新一代的演讲—《后浪》—心里有火 眼里有光 ,奔涌吧 后浪
  9. 使用Python评估一支股票的价格
  10. C51模拟PS2键盘(三)