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

如何理解promise 续一

某些关于promise的问题

能否执行多个回调?

当promise改变为对应状态时都会调用

let p = new Promise((resolve , reject) =>{resolve('success')})p.then(v=>{console.log(v)})p.then(v=>{alert(v)})

在这里插入图片描述

promise.then()返回的新promise的结果状态由什么决定

由then()指定的回调函数执行的结果决定

  • 如果抛出异常,新promise变为rejected,reason为抛出的异常
let p = new Promise((resolve, reject) => {resolve('success')})let result = p.then(v => {throw '错误'}, err => {console.log(err)})console.log(result)

在这里插入图片描述

  • 如果返回的是非promise的任意值,新promise变为resolved,value为返回的值
let p = new Promise((resolve, reject) => {resolve('success')})let result = p.then(v => {return 123}, err => {console.log(err)})console.log(result)

在这里插入图片描述

  • 如果返回的是另一个新promise,此promise的结果就会成为新promise的结果
let p = new Promise((resolve, reject) => {resolve('success')})let result = p.then(v => {return new Promise((resolve, reject)=>{resolve('ok')})}, err => {console.log(err)})console.log(result)

在这里插入图片描述

promise如何串连多个操作任务

  • promise的then()返回一个新的promise,可以写成then()的链式调用
  • 通过then的链式调用串连多个同步/异步任务
let p = new Promise((resolve, reject) => {resolve('success')})let result = p.then(v => {return new Promise((resolve, reject)=>{resolve('ok')})}).then(value=>{console.log(value)})

在这里插入图片描述

let p = new Promise((resolve, reject) => {resolve('success')})let result = p.then(v => {return new Promise((resolve, reject)=>{resolve('ok')})}).then(value=>{console.log(value)}).then(value=>{console.log(value)})

在这里插入图片描述

第二个undefined 产生的原因:

是因为then的返回结果是promise ,promise的返回状态由这个promise的返回值决定的;但是代码中的第一个then的返回值没有写,则第二个的结果就是undefined

promise 异常传透

  • 当使用promise的then链式调用时,可以在最后指定失败的回调
  • 前面任何操作出了异常,都会传到最后失败的回调中处理
let p = new Promise((resolve, reject) => {reject('fail')})let result = p.then(v => {return new Promise((resolve, reject)=>{resolve('ok')})}).then(value=>{console.log(value)}).then(value=>{console.log(value)}).catch(err=>{console.log(err)})

在这里插入图片描述

let p = new Promise((resolve, reject) => {resolve('success')})let result = p.then(v => {return new Promise((resolve, reject)=>{resolve('ok')})}).then(value=>{throw 'fail1'}).then(value=>{console.log(value)}).catch(err=>{console.log(err)})

在这里插入图片描述

中断promise 链

let p = new Promise((resolve, reject) => {resolve('success')})let result = p.then(v => {console.log(11)return new Promise(()=>{})}).then(value=>{throw 'fail1'}).then(value=>{console.log(value)}).catch(err=>{console.log(err)})

在这里插入图片描述

尝试自定义promise搭建

在html 页面中,先将promise的使用结构搭建出来

	<script type="text/javascript">let p =new Promise((resolve,reject)=>{resolve('success')})p.then(data=>{console.log(data)},err=>{console.warn(err)})</script>

新建一个promise.js文件,在html中引入这个promise

<script src="../js/promise.js" type="text/javascript" charset="utf-8"></script>
//覆盖Promise
function Promise(exectuor){// resolve 函数——表示成功执行的函数function resolve(data){}//reject 函数——表示失败执行的函数function reject(data){}//同步调用exectuorexectuor(resolve,reject);
}
//添加then 方法
Promise.prototype.then= function(onResolved,onRejected){}

http://www.mrgr.cn/news/100423.html

相关文章:

  • 解决Cline的Shell Integration Unavailable问题
  • OpenSSH配置连接远程服务器MS ODBC驱动与Navicat数据库管理
  • C++初阶-STL简介
  • 10 DPSK原始对话记录
  • ALTER TABLE 删除DROP表列的报错: 因为有一个或多个对象访问此列
  • MIT XV6 - 1.1 Lab: Xv6 and Unix utilities - sleep
  • 基于云原生架构的后端微服务治理实战指南
  • 【Linux】Centos7 在 Docker 上安装 mysql8.0(最新详细教程)
  • 【C++ 类和数据抽象】消息处理示例(2)
  • SHCTF-REVERSE
  • 6.图的OJ题(1-10,未完)
  • 【Pandas】pandas DataFrame rfloordiv
  • 文心一言开发指南06——千帆大模型平台新手指南
  • 《代码整洁之道》第8章 边界 - 笔记
  • Python 自动化办公:Excel 数据处理的“秘密武器”
  • 技能点总结
  • 【MCP】从一个天气查询服务带你了解MCP
  • 软考:软件设计师考试数据结构知识点详解
  • Redis使用总结
  • linux:进程的替换