JavaScript的执行环境是单线程

所谓单线程,是指JS引擎中负责解释和执行JavaScript代码的线程只有一个,也就是一次只能完成一项任务,这个任务执行完后才能执行下一个,它会「阻塞」其他任务。这个任务可称为主线程。

异步模式可以一起执行多个任务

常见的异步模式有以下几种:

  • 定时器

  • 接口调用

  • 事件函数

今天这篇文章,我们重点讲一下接口调用。接口调用里,重点讲一下Promise

接口调用的方式

js 中常见的接口调用方式,有以下几种:

  • 原生ajax
  • 基于jQuery的ajax
  • Fetch
  • Promise
  • axios

多次异步调用的依赖分析

  • 多次异步调用的结果,顺序可能不同步。

  • 异步调用的结果如果存在依赖,则需要嵌套。

在ES5中,当进行多层嵌套回调时,会导致代码层次过多,很难进行维护和二次开发;而且会导致回调地狱的问题。ES6中的Promise 就可以解决这两个问题。

Promise 概述

Promise的介绍和优点

ES6中的Promise 是异步编程的一种方案。从语法上讲,Promise 是一个对象,它可以获取异步操作的消息。

Promise对象, 可以将异步操作以同步的流程表达出来。使用 Promise 主要有以下好处:

  • 可以很好地解决回调地狱的问题(避免了层层嵌套的回调函数)。

  • 语法非常简洁。Promise 对象提供了简洁的API,使得控制异步操作更加容易。

回调地狱的举例

假设买菜、做饭、洗碗都是异步的。

但真实的场景中,实际的操作流程是:买菜成功之后,才能开始做饭。做饭成功后,才能开始洗碗。这里面就涉及到了多层嵌套调用,也就是回调地狱。

Promise 的基本用法

(1)使用new实例化一个Promise对象,Promise的构造函数中传递一个参数。这个参数是一个函数,该函数用于处理异步任务。

(2)并且传入两个参数:resolve和reject,分别表示异步执行成功后的回调函数和异步执行失败后的回调函数;

(3)通过 promise.then() 处理返回结果。这里的 p 指的是 Promise实例。

代码举例如下:

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8" /><meta name="viewport" content="width=device-width, initial-scale=1.0" /><title>Document</title></head><body><script>// 第一步:model层的接口封装const promise = new Promise((resolve, reject) => {// 这里做异步任务(比如ajax 请求接口。这里暂时用定时器代替)setTimeout(function() {var data = { retCode: 0, msg: 'qianguyihao' }; // 接口返回的数据if (data.retCode == 0) {// 接口请求成功时调用resolve(data);} else {// 接口请求失败时调用reject({ retCode: -1, msg: 'network error' });}}, 100);});// 第二步:业务层的接口调用。这里的 data 就是 从 resolve 和 reject 传过来的,也就是从接口拿到的数据promise.then(data => {// 从 resolve 获取正常结果console.log(data);}).catch(data => {// 从 reject 获取异常结果console.log(data);});</script></body>
</html>

上方代码中,当从接口返回的数据data.retCode的值不同时,可能会走 resolve,也可能会走 reject,这个由你自己的业务决定。

promise对象的3个状态(了解即可)

  • 初始化状态(等待状态):pending

  • 成功状态:fullfilled

  • 失败状态:rejected

(1)当new Promise()执行之后,promise对象的状态会被初始化为pending,这个状态是初始化状态。new Promise()这行代码,括号里的内容是同步执行的。括号里定义一个function,function有两个参数:resolve和reject。如下:

  • 如果请求成功了,则执行resolve(),此时,promise的状态会被自动修改为fullfilled。

  • 如果请求失败了,则执行reject(),此时,promise的状态会被自动修改为rejected

(2)promise.then()方法,括号里面有两个参数,分别代表两个函数 function1 和 function2:

  • 如果promise的状态为fullfilled(意思是:如果请求成功),则执行function1里的内容

  • 如果promise的状态为rejected(意思是,如果请求失败),则执行function2里的内容

另外,resolve()和reject()这两个方法,是可以给promise.then()传递参数的。

更多干货 请点击这里

Promise入门详解和基本用法 我来教你相关推荐

  1. [绍棠] Promise入门详解和基本用法

    异步调用 异步 JavaScript的执行环境是单线程. 所谓单线程,是指JS引擎中负责解释和执行JavaScript代码的线程只有一个,也就是一次只能完成一项任务,这个任务执行完后才能执行下一个,它 ...

  2. 【ES6】Promise对象详解

    [ES6]Promise对象详解 一.Promise对象的含义 二.Promise对象的用法 三.Promise对象的几个应用[重点] 1.时间延迟函数 2.图片异步加载 查看更多ES6教学文章: 参 ...

  3. python符号格式化设置区间_Python 数值区间处理_对interval 库的快速入门详解

    使用 Python 进行数据处理的时候,常常会遇到判断一个数是否在一个区间内的操作.我们可以使用 if else 进行判断,但是,既然使用了 Python,那我们当然是想找一下有没有现成的轮子可以用. ...

  4. [论文阅读] (01) 拿什么来拯救我的拖延症?初学者如何提升编程兴趣及LATEX入门详解

    又是在凌晨三点赶作业,又是在Deadline前去熬夜,一次次无眠,一次次抱怨.为什么三年前.两年前.一年前,甚至是昨天,我都下定决心"从现在开始读顶会论文",却又悄悄选择逃避:为什 ...

  5. C#语言入门详解笔记(9)—P19 委托详解

    C#语言入门详解_哔哩哔哩_bilibiliC#语言入门详解搬运,随youtube上进度更新.刘老师的C#视频教程到30集就告一段落了,感谢刘老师在这5年间的付出.能上youtube的同学可以去刘老师 ...

  6. 【JavaScript 教程】ES6 中的 Promise对象 详解

    [JavaScript 教程]ES6 中的 Promise对象 详解 1.Promise对象含义 promise是异步编程的一种解决方法. 所谓promise,简单说是一个容器,里面保存着某个未来才会 ...

  7. linux 日志按大小切割_nginx入门详解(六)- 日志切割

    上一章讲解了nginx的目录加密功能,本章重点介绍nginx的日志切割. 笨办法学linux:nginx入门详解(五)- 目录加密​zhuanlan.zhihu.com 在第二章,我们探讨了nginx ...

  8. python怎么安装myqr模块-python二维码操作:对QRCode和MyQR入门详解

    python是所有编程语言中模块最丰富的 生活中常见的二维码功能在使用python第三方库来生成十分容易 三个大矩形是定位图案,用于标记二维码的大小.这三个定位图案有白边,通过这三个矩形就可以标识一个 ...

  9. python语言编程基础-Python语言入门详解!快速学成Python!

    原标题:Python语言入门详解!快速学成Python! 很多技能是被职场所需要的,但很可惜... 这些技能在大学中并学习不到. 大学和职场现实存在的横沟对大部分同学来说难以跨越或碰得头破血流... ...

最新文章

  1. 三、概念数据模型CDM(Conceptual Database Model )
  2. 实战:使用Nginx限流
  3. 星座图与IQ调制总结+BPSK、QPSK、8PSK、16QAM等的区别与总结
  4. BeautifulSoup库使用
  5. mongodb 分片群集配置 及数据迁移
  6. 微信公众平台开发(97) 图文消息
  7. window.atob()与window.btoa()方法实现编码与解码
  8. python 自动输入_Python自动输入【新手必学】
  9. IT English Collection(9) of Objective-C
  10. [JavaWeb-XML]XML_快捷查询方式(selector选择器,XPath)
  11. c与python内存传递_python - 从Python向C ++传递COM指针数组 - 堆栈内存溢出
  12. 完美世界2020编程题-救雅典娜 英雄AB PK
  13. android技术服务,Android Service学习之本地服务
  14. JavaScript的对象观
  15. 康普顿效应是弹性碰撞吗_弹性填料用于洗涤塔
  16. 苹果屏蔽更新描述文件_安装iOS屏蔽更新描述文件教程方法
  17. PicGo搭建图床避坑
  18. win10文件资源管理器打开时很慢
  19. 自定义富媒体广告:NativeX SDK 5.0发布!
  20. linux 批量convert,使用convert来批量处理图片

热门文章

  1. C++知识点62——模板实参推断与函数模板的特化
  2. 两个不同网段的局域网如何互通_多台路由器,不同网段的设备之间如何互访?...
  3. Leetcode 1
  4. CentOS Linux最常用命令及快捷键整理
  5. WebAPI接口安全校验
  6. WCF wsHttpBinding之Transport security Mode, clientCredentialType=”Basic”
  7. Python中str.replace()的使用方法
  8. 解读ASP.NET 5 MVC6系列(7):依赖注入
  9. Linux内核学习--内存管理模块
  10. java框架篇---hibernate(一对多)映射关系