Promise 对象

目录

  • Promise 对象
    • 概述
    • Promise解决异步的优点
    • 基本用法
      • then方法
    • Promise对象实现的 Ajax 操作
    • Promise对象实现的图片加载
    • 方法
      • 方法详解

概述

Promise是异步编程的一种解决方案

从语法上说,Promise 是一个对象,从它可以获取异步操作的消息

Promise对象有两个特点:

  • 对象的状态不受外界影响。有三种状态:

    1. pending:进行中
    2. fulfilled:已成功(resolved)
    3. rejected:已失败
  • 一旦状态改变,就不会再该变,任何时候都可以得到这个结果

状态的缺点:

  1. 无法取消 Promise ,一旦新建它就会立即执行,无法中途取消
  2. 如果不设置回调函数,Promise 内部抛出的错误,不会反应到外部
  3. 当处于 pending 状态时,无法得知目前进展到哪一个阶段(不知道是刚刚开始还是即将完成)

回到顶部 目录

Promise解决异步的优点

回调地狱:某个异步操作需要等待之前的异步操作完成,无论回调是事件还是其他函数,都会陷入不断的嵌套(简单来说就是无数的嵌套函数)

Promise的出现,可以将异步操作以同步的流程表达出来,很好的解决了回调地狱

基本用法

Promise对象是一个构造函数,该函数有两个参数:

  • resolve:在异步操作成功时调用,并将异步操作的结果,作为参数传递出去
  • reject:在异步操作失败时调用,并将异步操作报出的错误,作为参数传递出去
const p = new Promise(function(resolve,reject){console.log('one');resolve('three');
});p.then(resolve => {console.log(resolve);
}, err => {console.log(err);
});console.log('tow');
  • Promise 新建后就会立即执行

then方法

Promise实例生成以后,可以用``分别指定resolved状态和rejected状态的回调函数

该方法的两个参数:

  1. 回调函数是Promise对象的状态变为resolved时调用(必须)
  2. 回调函数是Promise对象的状态变为rejected时调用(可选)

回到顶部 目录

Promise对象实现的 Ajax 操作

const ajax = function(url) {return new Promise(function(resolve, reject){const xml = new XMLHttpRequest();xml.open("GET", url, true);xml.onreadystatechange = function() {if (this.readyState !== 4) {return;}if (this.status === 200) {resolve(this.responseText);} else {reject(new Error(this.statusText));}};xml.send();});
};ajax("data.json").then(res => {console.log(res);return res;
}).catch(err => {console.log(err);
})
.then(function(res) {console.log(res);
})

Promise对象实现的图片加载

const getImage = function (path) {return new Promise((resolve, reject) => {const img = new Image();img.onload  = resolve;img.onerror = reject;img.src = path;});
};

回到顶部 目录

方法

方法|用途
:–|:–|:–
Promise.prototype.then(resolved[,rejected])|为Promise实例添加状态改变时的回调函数
Promise.prototype.catch(rejection)|用于指定发生错误时的回调函数(只要Promise方式错误就可以捕获)
Promise.prototype.finally()|用于指定不管 Promise 对象最后状态如何,都会执行的操作(ES2018)
Promise.all([new Promise,…])|这个方法会返回一个新的promise对象,如果里面所有的promise对象都成功才会触发,一旦有一个失败,则该promise对象为失败
Promise.race([new Promise,…])|当参数中的任意一个promise对象完成时候,就马上回去使用完成的这个promise对象的结果,不管这个结果成功还是失败
Promise.allSettled([new Promise,…])|这个方法会返回一个新的promise对象,只有等到所有这些参数实例都返回结果,不管是fulfilled还是rejected,包装实例才会结束(ES2020)
Promise.resolve([*])|将现有对象转为 Promise 对象
Promise.reject(reason)|返回一个新的 Promise 实例,该实例的状态为rejected
Promise.try()|类似于try{}异常处理机制

方法详解

看这期前可以先查看:JavaScript异步和渲染过程

回到顶部 目录

Promise回调地狱的拯救者相关推荐

  1. 使用ES6的Promise完美解决回调地狱

    相信经常使用ajax的前端小伙伴,都会遇到这样的困境:一个接口的参数会需要使用另一个接口获取. 年轻的前端可能会用同步去解决(笑~),因为我也这么干过,但是极度影响性能和用户体验. 正常的前端会把接口 ...

  2. 语言解决猜神童年龄的问题_JavaScript语言基础:Promise是如何解决回调地狱问题的?...

    链接:https://juejin.im/post/5aa1fce051882555677e21aa 众所周知的,Javascript是一种单线程的语言,所有的代码必须按照所谓的"自上而下& ...

  3. 解决异步问题,教你如何写出优雅的promise和async/await,告别callback回调地狱!

    解决异步问题--promise.async/await 一.单线程和异步 1.单线程是什么 2.为什么需要异步 3.使用异步的场景 二.promise 1.promise的三种状态 2.三种状态的表现 ...

  4. 使用promise解决回调地狱_「每日一题」Promise 是什么?

    window.Promise 已经是 JS 的一个内置对象了. 1. Promise 有规格文档吗? 2. 你一般如何使用 Promise. ----------- 目前的 Promise 都遵循 P ...

  5. vue页面取ajax返回值,Vue前端交互模式、Promise用法(回调地狱)

    Promise 概述Promise 是异步编程的一种解决方案,从语法上讲,Promise 是一个对象,从它可以获取异步操作的消息. 优点:可以避免多层异步调用嵌套问题(回调地狱) Promise 对象 ...

  6. Promise学习——解决回调地狱问题

    Promise promise 容器概念: callback hell(回调地狱): 文件的读取无法判断执行顺序(文件的执行顺序是依据文件的大小来决定的)(异步api无法保证文件的执行顺序) var ...

  7. Promise使用,return的运用,解决回调地狱

    Promise使用,return的运用,解决回调地狱 回调地狱 httpBookModel.getHotList().then((res) => {console.log(res)httpBoo ...

  8. ES6(三)——回调地狱和promise异步任务顺序执行(传参、错误处理)

    文章目录 方法一.回调函数(回调地狱) 方法二:promise 2.1异步任务传参(单个) 2.2异步任务传参(多个) 2.3 错误处理 2.4 Promiss对象三大状态: (学名) 2.5 Pro ...

  9. Promise解决回调地狱写法

    这里可以使用Promise来解决回调地狱的问题! 那么我们这里有一个需求,就是我们需要读取三个 .txt 文件,需要第一个文件读取完成后才能读取第二个文件以此类推. 那么这里来一个Promise的错误 ...

最新文章

  1. 段永朝:界面——之内、之外与之间
  2. 电脑开机老是显示explorer.exe文件损坏
  3. python图像处理实战 戴伊_这一套封面的程序员专业书籍你读过哪一本?
  4. 操作系统安装与优化:chapter8 虚拟机
  5. 嵌入式面试知识点总结 -- ARM篇
  6. 《美团点评编程题》整数加法
  7. MVVM模式下实现拖拽
  8. 基于ASP.NET Core 3.0的ABP v0.21已发布
  9. amd服务器有什么优势,服务器市场才是AMD真正想要发挥作用的地方
  10. mysql syntaxerror_解析bitronix连接MySQL出现MySQLSyntaxErrorException错误的解决方法
  11. c++ assert() 使用方法
  12. 华为发布全新一代OceanStor存储Pacific系列,打造海量数据存储新标杆
  13. chrome plugins
  14. 创建shap文件的属性字段类型区别_shapefile数据文件组成
  15. 以下不是python3保留字的是_python 保留字
  16. 计算机键盘没有fn,电脑上没有FN键怎么打开小键盘
  17. Unity背包系统(二)背包UI设计
  18. sersync+rsync的热备份研究(热备+断点续传)
  19. pytorch3d代码解释:pytorch3d.structures.meshes之verts_list, verts_packed, verts_padded
  20. Python 文本解析器

热门文章

  1. Windows系统操作指令
  2. xss漏洞开源网站包
  3. java需要用到英语_javaSE常用的英语单词
  4. PSM倾向匹配详细步骤和程序
  5. 国产电脑支持Linux吗,天玥计算机(电脑)支持UOS、银河麒麟、Deepin等国产操作系统...
  6. 特斯拉看位置说服务器错误,特斯拉App惊现大面积宕机!车主集体发飙,官方处理太弱智了...
  7. ubuntu桌面便签_在Ubuntu 上有什么必装的实用软件?
  8. 读书寄语:所有的遇见都是有原因的,并不只是偶然
  9. 第008篇:ArcGIS中点对落入多边形的位置关系(相邻/相离)的判定
  10. CTF-密码学-bacon