第124篇: 期约Promise基本方法

期约,promise,基本,方法 · 浏览次数 : 58

小编点评

**JavaScript Promised编程** **1.异步编程同步行为和异步行为的对立统一** 在 JavaScript 中,由于单线程,同步操作和异步操作会阻塞主线程,导致代码无法执行其他操作。异步编程通过使用 Promise 或 A+ 类来解决这个问题,允许多个异步操作同时运行并以异步方式执行。 **2. 期约** 期约是对承诺(结果)的替代,它是 Promise 或 A+ 类中表示的一个状态。期约状态可以是: * **pending**:等待状态,表示 Promise 还处于异步操作中。 * **resolved**:兑现状态,表示 Promise 收到了结果。 * **rejected**:拒绝状态,表示 Promise 收到了错误。 **3. 期约方法** `Promise.resolve()` 和 `Promise.reject()` 方法用于实例化和管理期约。`resolve()` 方法用于创建一个新的已解决的 Promise,而 `reject()` 方法用于创建一个新的已拒绝的 Promise。 **4. Promise.prototype.then() 和 Promise.prototype.catch()** `then()` 方法允许您在 Promise 状态改变时执行回调函数。`catch()` 方法允许您在 Promise 被拒绝时执行回调函数。 **5. Promise.all()** `Promise.all()` 方法用于合并多个 Promise 对象,并以异步方式执行它们。返回结果是一个新的 Promise 对象,该 Promise 表示所有 Promise 的结果。 **6. Promise.race()** `Promise.race()` 方法用于获取第一个解决或拒绝的 Promise 的结果。 **7. Promise.resolve() 和 Promise.reject()** `Promise.resolve()` 方法用于将任何值转换为已解决的 Promise 对象。`Promise.reject()` 方法用于将任何值转换为已拒绝的 Promise 对象。 **8. Promise.finally()** `Promise.finally()` 方法用于在 Promise 解决方案或拒绝后执行操作。无论 Promise 的最终结果如何,该方法都会被执行。 **9. 使用 Promise 链** Promise 链是一种使用 Promise 对象来实现嵌套异步操作的技术。您可以使用 `then()` 方法将下一个 Promise 实例作为参数传入 `then()` 方法中。例如: ```javascript let promise = new Promise(function (resolve, reject) { // 异步操作 }); promise.then(function (result) { // 处理第一个 Promise 的结果 }, function (error) { // 处理第一个 Promise 的错误 }); // 处理第二个 Promise 的结果 ``` **10. 总结** * **Promise** 是一个用于管理异步操作的 JavaScript 对象。 * **Promise.all()** 和 **Promise.race()** 用于合并多个 Promise 对象并以异步方式执行它们。 * **Promise.resolve() 和 Promise.reject()** 用于实例化和管理 Promise。 * **Promise.finally()** 用于在 Promise 解决方案或拒绝后执行操作。

正文

好家伙,本篇为《JS高级程序设计》第十章“期约与异步函数”学习笔记

 

1.异步编程

同步行为和异步行为的对立统一是计算机科学的一个基本概念。

特别是在 JavaScript 这种单线程事 件循环模型中,同步操作与异步操作更是代码所要依赖的核心机制。

异步行为是为了优化因计算量大而 时间长的操作。如果在等待其他操作完成的同时,即使运行其他指令,系统也能保持稳定,那么这样做 就是务实的。

重要的是,异步操作并不一定计算量大或要等很长时间。只要你不想为等待某个异步操作而阻塞线 程执行,那么任何时候都可以使用。

 

 

2.期约Promise基础概念

期约是对尚不存在结果的一个替身。ECMAScript 6 增加了对 Promises/A+规范的完善支持,即 Promise 类型。

我们可以把期约看做一个状态机

期约有单个状态

 待定(pending)

 兑现(resolved,edge浏览器中是"fulfilled")

 拒绝(rejected)

待定(pending)是期约的最初始状态。

在待定状态下,期约可以落定(settled)为代表成功的兑现 (fulfilled)状态,或者代表失败的拒绝(rejected)状态。

无论落定为哪种状态都是不可逆的。只要从待 定转换为兑现或拒绝,期约的状态就不再改变。

 

由于期约的状态是私有的,所以只能在内部进行操作。

let p1 = new Promise((resolve, reject) => resolve()); 
setTimeout(console.log, 1000, p1); // Promise <resolved> 

let p2 = new Promise((resolve, reject) => reject()); 
setTimeout(console.log, 1000, p2); // Promise <rejected>

console.log(p1);

 

 

3.期约方法

3.1.Promise.resolve()

期约并非一开始就必须处于待定状态,然后通过执行器函数才能转换为落定状态。

通过调用 Promise.resolve()静态方法,可以实例化一个解决的期约。

(注意此处是实例化一个"解决"状态的期约)

 

3.2.Promise.reject()

Promise.resolve()类似,Promise.reject()会实例化一个拒绝的期约并抛出一个异步错误

let p1 = new Promise((resolve, reject) => resolve()); 
let p2 = Promise.resolve(); 

let p3 = new Promise((resolve, reject) => reject()); 
let p4 = Promise.reject(); 

console.log(p1);
console.log(p2);

console.log(p3);
console.log(p4);

 

 

 

 

4.期约实例方法

4.1.Promise.prototype.then(onResolved,onRejected)

Promise.prototype.then()是为期约实例添加处理程序的主要方法。

接受两个参数

onResolved 处理程序和 onRejected 处理程序。

这两个参数都是可选的,如果提供的话, 则会在期约分别进入“兑现”和“拒绝”状态时执行。

function onResolved(id) {
    setTimeout(console.log, 0, id, 'resolved');
}

function onRejected(id) {
    setTimeout(console.log, 0, id, 'rejected');
}
let p1 = new Promise((resolve, reject) => setTimeout(resolve, 3000));
let p2 = new Promise((resolve, reject) => setTimeout(reject, 3000));
p1.then(() => onResolved('p1'),() => onRejected('p1'));
p2.then(() => onResolved('p2'),() => onRejected('p2'));

 

 

 

若不带参数

Promise.prototype.then()方法返回一个新的期约实例

 

let p1 = new Promise(() => {}); 
let p2 = new Promise((resolve, reject) => reject()); 
let p3 = new Promise((resolve, reject) => resolve()); 

console.log(p1.then());
console.log(p2.then());
console.log(p3.then());

 

 

 

 

4.2.Promise.prototype.catch()

 Promise.prototype.catch()方法用于给期约添加拒绝处理程序。

 事实上,这个方法就是一个语法糖,调用它就相当于调用 Promise.prototype. then(null, onRejected)

 

let p1 = Promise.reject(); 
let onRejected = function(e) { 
 console.log('Promise rejected'); 
}; 
// 这两种添加拒绝处理程序的方式是一样的:
p1.then(null, onRejected); // rejected 
p1.catch(onRejected); // rejected 

 

 

 

 

 

 

4.3.Promise.prototype.finally()

 Promise.prototype.finally()方法用于给期约添加 onFinally 处理程序,这个处理程序在期 约转换为解决或拒绝状态时都会执行。

 (也就是说只要发生了状态变化就会执行)

 

let p1 = Promise.resolve(); 
let p2 = Promise.reject(); 
let onFinally = function() { 
  console.log( 'Promise Finally!') 
} 
p1.finally(onFinally); // Finally 
p2.finally(onFinally); // Finally 

 

 

 

 

 

 

 5.课后习题

最近发现了一些问题,每次学完之后很快就忘,所以我决定加一些题目来巩固记忆,也便于日后快速复习

(最主要目的,学完之后去问别人,当然,别人问你你不知道就尴尬了)

1.什么是JavaScript Promises?

  答:JavaScript Promises是异步编程的一种解决方案,它允许您将承诺(一个将来的特定结果)与回调函数相关联,以便在异步操作完成后获取结果。

2.什么是Promise链?

  答:Promise链是一种将多个Promise对象组合在一起的模式,可以按顺序执行异步操作,并在每个操作完成后获取结果。

3.为什么使用Promises

  答:使用Promises可以更容易地管理复杂的异步操作,可以减少回调函数嵌套和确保结果始终可用。避免回调地狱

4.什么是.then()

  答:.then()是一个Promise方法,可以让您指定在Promise状态改变为解决或拒绝后要执行的操作。

5.什么是.catch()?

  答:.catch()是一个Promise方法,可以用于指定在Promise被拒绝时要执行的操作。

6.什么是Promise.all()?

  答:Promise.all()是一个Promise方法,用于将多个Promise对象合并到一起,以便在所有Promise对象都解决或拒绝后获取结果。

7.什么是Promise.race()?

  答:Promise.race()是一个Promise方法,可以用来获取第一个解决或拒绝的Promise对象的结果。

8.什么是Promise.resolve()?

  答:Promise.resolve()是一个Promise方法,可以用于将值转换为一个已解决的Promise对象。

9.什么是Promise.reject()?

  答:Promise.reject()是一个Promise方法,可以用于将值转换为已拒绝的Promise对象。

10.什么是Promise.finally()?

  答:Promise.finally()是一个Promise方法,可以用于在Promise解决或拒绝后执行操作,而不论Promise的最终结果如何。

11.如何使用Promise链?

  答:Promise链是一种使用Promise对象来实现嵌套异步操作的技术。要使用Promise链,需要在每个Promise实例上调用.then()方法,并将  下一个Promise实例作为参数传入。例如:

let promise = new Promise(function (resolve, reject) { // 异步操作 
});

promise
    .then(function (result) { // 处理第一个Promise的结果 
        return new Promise(function (resolve, reject) {
            //异步操作
        });
    })
    .then(function (result) { // 处理第二个Promise的结果 
    });

 

 

与第124篇: 期约Promise基本方法相似的内容:

第124篇: 期约Promise基本方法

好家伙,本篇为《JS高级程序设计》第十章“期约与异步函数”学习笔记 1.异步编程 同步行为和异步行为的对立统一是计算机科学的一个基本概念。 特别是在 JavaScript 这种单线程事 件循环模型中,同步操作与异步操作更是代码所要依赖的核心机制。 异步行为是为了优化因计算量大而 时间长的操作。如果在

.NET周报【12月第4期 2022-12-31】

祝大家新年快乐! 国内文章 『 再看.NET7』数值类型 https://mp.weixin.qq.com/s/ctiBMPY6Hditk81AzHSRng 在C#中,有int16,用short来定义;有int32,用int定义;用int64,用long来定义。在.NET7中,添加了int128,和

第一百零五篇:变量的原始值和引用值

好家伙,JS基础接着学, 本篇内容为《JS高级程序设计》第四章学习笔记 1.原始值和引用值 ECMAScript变量可以包含两种不同类型的数据:原始值和引用值。原始值(primitive value)就是最简单的数据,引用值(reference value)则是由多个值构成的对象。 在把一个值赋给变

第一百零六篇:变量的不同声明(var,let和const的不同)

JS关于变量的声明,变量提升,暂时性死区

第一百零七篇:基本数据类型(undefined,null,boolean类型)

好家伙, 本篇内容为《JS高级程序设计》第三章学习笔记 1.数据类型 ECMAScript有6种简单数据类型(称为原始类型): Undefined, Null, Boolean, Number, String和Symbol。 Symbol (符号)是ECMAScript6新增的。还有一种复杂数据类型

第一百零八篇:最常用的基本数据类型(Number类型)

最常用的基本数据类型(Number类型)

第一百一十篇:内存泄漏和垃圾回收(JS)

好家伙,本篇内容为《JS高级程序设计》第四章的学习笔记 1.内存泄露 1.1.什么是内存泄漏? 内存泄漏(Memory Leak)是指程序中已动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果。 内存泄漏缺陷具有隐蔽性、积累性的特征,比其

第一百一十一篇:基本引用类型Date

好家伙,本篇为《JS高级程序设计》第五章的学习笔记 1.基本引用类型 引用值(或者对象)是某个特定引用类型的实例,在ECMAScript中,引用类型是把数据和功能组织到一起的结构,(像极了“类”) 经常被人错误的称作“类”。 虽然从技术上讲JavaScript是一门面向对象语言,但是ECMAScri

第一百一十二篇: JS数组Array(一)数组基本用法

好家伙, 1.数组 Array应该就是ECMAScript中最常用的类型了。ECMAScript数组跟其他编程语言的数组有很大区别。 跟其他语言中的数组一样,ECMAScript 数组也是一组有序的数据, 但跟其他语言不同的是,数组中每个槽位可以存储任意类型的数据。 这意味着可以创建一个数组,它的第

第一百一十四篇: JS数组Array(三)数组常用方法

好家伙,本篇为《JS高级程序设计》第六章“集合引用类型”学习笔记 1.数组的复制和填充 批量复制方法 copyWithin(),以及填充数组方法fill()。 这两个方法的函数签名类似,都需要指定既有数组实例上的一个范围,包含开始索引,不包含结束索引。 使用这个方法不会改变数组的大小。 1.1.fi