[红宝书]第11章-Promise

简介: [红宝书]第11章-Promise

前言



本文是有关《Javascript高级程序设计》第11章内容的总结,并结合掘金的一些博客,总结一下Promise


Promise



基本用法


关于Promise的一些Api和基础的用法,相信大家有已经了解,这里就不再赘述,只是做一个小的总结


image.png


这是Promise的一些Api,不熟悉的可以自行百度查看~


同步/异步执行的二元性


try { 
    Promise.reject(new Error('bar')); 
} catch(e) { 
    console.log(e); 
} 
// Uncaught (in promise) Error: bar


这里的Promise.reject()明明是同步创建出来一个reject的promise的实例,为什么还是不能被try...catch...捕获到呢?

这里的同步代码之所以没有捕获Promise抛出的错误,是因为它没 有通过异步模式 捕获错误。从这里就可以看出Promise真正的异步特性: 它们是同步对象(在同步执行模式中使用),但也是异步执行模式的媒介。

拒绝Promise的错误并没有抛到执行同步代码的线程 里,而是通过浏览器异步消息队列来处理的。因此,try /catch 块 并不能捕获该错误。代码一旦开始以异步模式执行,则唯一与之交互 的方式就是使用异步结构——更具体地说,就是Promise的方法。


thenable接口


任何对象有一个then()方法,就认为是实现了Thenable接口


class MyThenable { 
    then() {} 
}
const MyThenable = {
    then(){}
}
const MyThenable = {
    then: function(){}
}


Promise.prototype.then()


let p1 = new Promise((resolve) => {resolve('p1')})
let p2 = p1.then(() => {
    console.log('p2')
})
let p3 = p2.then(() => {
    console.log('p2的状态',p2)
    console.log('p3')
})
// p2
// p2的状态 Promise { undefined }
// p3


新期约实例基于onResovled 处理程序的返回值构建。换句话说,该处理程序的返回值会通过Promise.resolve() 包装来生成新 期约。如果没有提供这个处理程序,则Promise.resolve() 就会包 装上一个期约解决之后的值。如果没有显式的返回语句,则 Promise.resolve() 会包装默认的返回值undefined 。

由于p1没有返回值,所以p2的值是undefined,但是都是resolved的状态

注意

抛出异常会返回拒绝的期约

返回错误值不会触发上面的拒绝行为,而会把错误对象包装在 一个解决的期约中


Promise.resolve


  • 如果参数是 Promise 实例,那么Promise.resolve将不做任何修改、原封不动地返回这个实例
  • 参数是一个thenable对象,Promise.resolve()方法会将这个对象转为 Promise 对象,然后就立即执行thenable对象的then()方法。
  • 如果参数是一个原始值,或者是一个不具有then()方法的对象,则Promise.resolve()方法返回一个新的 Promise 对象,状态为resolved



目录
相关文章
|
SQL Oracle 关系型数据库
本机不安装Oracle客户端,使用PL/SQL Developer连接远程数据库
本机不安装Oracle客户端,使用PL/SQL Developer连接远程数据库
573 0
|
11月前
|
程序员 测试技术 开发者
为什么多数程序员都不做个人独立开发?技术干货分享
【10月更文挑战第1天】在软件开发这个充满无限可能的领域里,个人独立开发似乎是一个极具吸引力的选项。然而,现实却是大多数程序员选择了在公司或团队中工作,而非走上个人独立开发的道路。本文将深入探讨这一现象背后的原因,并结合技术学习的角度,为大家带来一些实用的技术干货。
314 1
|
存储 弹性计算 固态存储
VMware虚拟机迁移到阿里云
各种架构的主机资源如何迁移上阿里云?本文以VMware虚拟机迁移到阿里云为例,介绍一些迁移上阿里云的方式。
VMware虚拟机迁移到阿里云
|
6月前
|
运维 Kubernetes Java
Koupleless 助力「人力家」实现分布式研发集中式部署,又快又省!
通过引入Koupleless框架,解决了多应用部署中资源浪费和运维成本高的问题,实现了模块瘦身、快速部署及流量控制优化,大幅降低了服务器资源占用和发布耗时,提升了系统稳定性和运维效率。最终,人力家成功实现了多应用的轻量集中部署,显著减少了运维成本。
 Koupleless 助力「人力家」实现分布式研发集中式部署,又快又省!
|
6月前
|
Java 数据库
【YashanDB知识库】kettle同步大表提示java内存溢出
在数据导入导出场景中,使用Kettle进行大表数据同步时出现“ERROR:could not create the java virtual machine!”问题,原因为Java内存溢出。解决方法包括:1) 编辑Spoon.bat增大JVM堆内存至2GB;2) 优化Kettle转换流程,如调整批量大小、精简步骤;3) 合理设置并行线程数(PARALLELISM参数)。此问题影响所有版本,需根据实际需求调整相关参数以避免内存不足。
|
7月前
|
数据采集 JSON 监控
速卖通商品列表接口(以 AliExpress Affiliate 商品查询 API 为例)
以下是使用 Python 调用速卖通商品列表接口(以 AliExpress Affiliate 商品查询 API 为例)的代码示例。该示例包含准备基础参数、生成签名、发送请求和处理响应等关键步骤,并附有详细注释说明。代码展示了如何通过公共参数和业务参数构建请求,使用 HMAC-SHA256 加密生成签名,确保请求的安全性。最后,解析 JSON 响应并输出商品信息。此接口适用于商品监控、数据采集与分析及商品推荐等场景。注意需通过 OAuth2.0 获取 `access_token`,并根据官方文档调整参数和频率限制。
|
10月前
|
安全 Java API
告别SimpleDateFormat:Java 8日期时间API的最佳实践
在Java开发中,处理日期和时间是一个基本而重要的任务。传统的`SimpleDateFormat`类因其简单易用而被广泛采用,但它存在一些潜在的问题,尤其是在多线程环境下。本文将探讨`SimpleDateFormat`的局限性,并介绍Java 8引入的新的日期时间API,以及如何使用这些新工具来避免潜在的风险。
139 5
|
11月前
|
搜索推荐 数据挖掘 数据处理
NVIDIA Triton系列12-模型与调度器2
本文介绍了NVIDIA Triton服务器的“集成推理”功能,涵盖“集成模型”与“集成调度器”两部分,通过示例说明了如何构建一个包含图像预处理、分类和语义分割的推理流水线,强调了模型间数据张量的连接与处理,以及配置集成模型和调度器的具体步骤。
203 1
NVIDIA Triton系列12-模型与调度器2
|
运维 监控 Java
如何在阿里云serverless发布一个Springboot应用
本文主要很大家分享了如何在阿里云serverless发布一个Springboot应用,通过实际的操作感受serverless对于未来研发流程的巨大变革。
|
弹性计算 Linux 数据库
阿里云ECS服务器安装宝塔BT面板图文教程
宝塔BT面板支持Linux和Windows系统,本文以阿里云ECS云服务器Linux系统安装宝塔面板为例,云服务器吧分享安装宝塔面板教程: ECS安装宝塔BT面板图文教程开始: SSH登录ECS服务器 使用命令ssh root@你的服务器公网IP登录linux服务器。
19513 0
阿里云ECS服务器安装宝塔BT面板图文教程