当前位置: 首页 > news >正文

了解promise

虽然一直也有用到promise, 知道它代表了异步操作成功或者失败的一个对象,至于它到底是什么,怎么解决了回调地狱的问题,就解释不出个所以然,所以打算研究一下并记录下来供学习参考。

背景

JavaScript是单线程的,这就意味着两段脚本不能同时运行,由于这种设定,所有的js事件都必须是异步执行,没有promise之前,解决异步都是依赖回调,典型的异步执行操作有ajax,事件监听,setTimeout等,当你想执行多个具备前后顺序的异步操作时,代码会嵌套许多层,导致出现问题也很难调试。

什么是promise

Promise是异步编程的一种解决方案,比原来的回调函数更加合理。从语法上来讲它是一个对象,可以获取异步操作的状态。

Promise的特点

一.Promise对象代表一个异步操作,有三种状态:pengding(进行中),fulfilled(已成功),rejected(已失败️)。 Promise的状态由异步操作的结果决定。

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

Promise的优点

Promise最直接的好处就是链式调用。通过.then的形式可以添加多个回调函数,它们会按照插入顺序独立运行。

Promise的缺点

一.无法取消。一旦新建它就会立即执行,无法中途取消。

二.如果不设置回调函数,Promise内部抛出的错误不会反应到外部。

三.当Promise处于pengding状态时,无法得知目前进行到哪个阶段,是刚开始还是即将完成。

基本用法

ES6规定,Promise对象是一个构造函数,用来生成Promise实例。

Promise构造函数接受一个函数作为参数,该函数的两个参数分别是resolve和reject。它们是两个函数,由Javascript引擎提供。resolve函数在异步操作成功时调用,并将异步操作的结果作为参数传递出去;reject函数在异步操作失败时调用,并将异步操作报出的错误,作为参数传递出去。

下面代码把异步操作成功调用的代码写在.then()中,把异步操作失败调用的方法写在.catch()中

/* post 方法 promise 封装 */
const postWrap = (url, params) => {
  return new Promise((resolve, reject) => {
    instance.post(url, params).then(({
      data
    }) => resolve(data)).catch(err => reject(err));
  })
}
复制代码

这里只讲了一些基本概念和基础用法。Promise还有许多Api,使用起来非常强大。

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

相关文章:

  • AI又要和人类“对打”,Deepmind宣布《星战Ⅱ》即将开始 ...
  • javascript 几种常用继承方法和优缺点分析
  • Python零基础学习笔记(三十六)—— 递归
  • 『高级篇』docker之课程管理dubbo入门操练(14)
  • 离家46年 志愿者助94岁老兵回乡
  • updateByPrimaryKeySelective更新失败
  • MySQL5.6主从复制最佳实践
  • 关于STL库中的max min swap
  • 前端技术选型的遗憾和经验教训
  • 吴昕曝最新写真 百变风格引领冬日风尚
  • js---通过arguments来获取指定参数
  • 洛谷P1117 优秀的拆分
  • fzyzojP3979 -- [校内训练20180914]魔法方阵
  • 对话 CTO〡听神策数据 CTO 曹犟描绘数据分析行业的无限可能
  • yum命令详解
  • 【笔记】你不知道的JS读书笔记——Promise
  • Angular js 常用指令ng-if、ng-class、ng-option、ng-value、ng-click是如何使用的?
  • Apache的80端口被占用以及访问时报错403
  • MYSQL 的 IF 函数
  • Node项目之评分系统(二)- 数据库设计
  • PhantomJS 安装
  • Python学习之路16-使用API
  • Redis字符串类型内部编码剖析
  • 阿里研究院入选中国企业智库系统影响力榜
  • 编写符合Python风格的对象
  • 基于Volley网络库实现加载多种网络图片(包括GIF动态图片、圆形图片、普通图片)...
  • 类orAPI - 收藏集 - 掘金
  • 面试题:给你个id,去拿到name,多叉树遍历
  • 普通函数和构造函数的区别
  • 使用common-codec进行md5加密
  • 自制字幕遮挡器
  • 3月27日云栖精选夜读 | 从 “城市大脑”实践,瞭望未来城市源起 ...
  • #define、const、typedef的差别
  • (1)(1.13) SiK无线电高级配置(五)
  • (3)选择元素——(14)接触DOM元素(Accessing DOM elements)
  • (C语言)深入理解指针2之野指针与传值与传址与assert断言
  • (C语言)输入一个序列,判断是否为奇偶交叉数
  • (iPhone/iPad开发)在UIWebView中自定义菜单栏
  • (java版)排序算法----【冒泡,选择,插入,希尔,快速排序,归并排序,基数排序】超详细~~
  • (附源码)springboot助农电商系统 毕业设计 081919
  • (转)es进行聚合操作时提示Fielddata is disabled on text fields by default
  • (转载)从 Java 代码到 Java 堆
  • ****** 二十三 ******、软设笔记【数据库】-数据操作-常用关系操作、关系运算
  • .NET Core 控制台程序读 appsettings.json 、注依赖、配日志、设 IOptions
  • .net core 实现redis分片_基于 Redis 的分布式任务调度框架 earth-frost
  • .NET gRPC 和RESTful简单对比
  • .net 发送邮件
  • .Net 访问电子邮箱-LumiSoft.Net,好用
  • .NET 将混合了多个不同平台(Windows Mac Linux)的文件 目录的路径格式化成同一个平台下的路径
  • .net 前台table如何加一列下拉框_如何用Word编辑参考文献
  • .net遍历html中全部的中文,ASP.NET中遍历页面的所有button控件
  • @Transactional 详解
  • [ 隧道技术 ] 反弹shell的集中常见方式(四)python反弹shell
  • [17]JAVAEE-HTTP协议
  • [AIGC] Java 和 Kotlin 的区别