---
title: 学习笔记之es6中的promise
date: 2026-09-03
tags:
- 技术
description: 文章摘要
---初学异步对象的时候非常模糊,学了几个小时只能说懵懵懂懂。这篇笔记用来记录自己初学过程中的疑惑,帮助更好消化。 首先要先知道什么是异步? 异步指的是程序在执行一个耗时任务(如网络请求、定时器、读取文件)时,不必等待该任务完成,而是先继续执行后续代码;等耗时任务在后台处理完毕(成功或失败)后,再通过回调Promise 或事件来通知主程序处理结果。JavaScript 中“异步函数”通常专指用 async 声明的函数。 第二如何使用 Promise 处理异步任务? 这里用两个写法来概括 第一种就是标准写法:
const p1 = new Promise ((resolve,reject) =>{
//promise对象Promise 有三种状态。状态由里面的处理函数决定,状态确定后不可修改
//- pending:等待中
//- fulfilled:成功,调用了 resolve
//- rejected:失败,调用了 reject
if (条件成立) {
resolve("事件一成功");
} else {
reject("失败")
}
});
//.then方法一般用于处理p1成功后的情况(err用在.catch中更加直观),其中:
//-data:接收 p1 成功时传给 resolve(...) 的值。
//-err:接收 p1 失败时传给 reject(...) 的值。
p1.then(
data => { console.log("事件二成功") },
//err => { ... }
)
.then(data =>{console.log(data) }
//data undefined
//第二个then()方法接收的值是前一个then的返回值。
//第一个then()返回的promise调用成功,值undefined
.catch(error =>{ ...})上面代码中,p1 是一个 Promise 对象,用来表示异步任务未来的完成状态和结果, .then() 和 .catch()里的回调函数是“事件1结束后要做的事件2”
const p1 = new Promise ((resolve,reject) =>{
if (条件成立) {
resolve("事件一成功");
} else {
reject("失败");
}
})
async function run() {
try {
const data = await p1
console.log(data)
} catch (err) {
console.log(err)
}
}
//- data 是 await 得到的成功结果,不是函数形参。
//- err 是 catch 捕获到的失败原因,也不是函数形参。
上面两段对比,async/await + try/catch 的写法,在逻辑上与 .then/.catch 完全等价,好处就是看起来更像同步事件,无需链式调用(.then方法会返回新的promise对象,后一个then接收的是前一个then的值),后续更多环环相扣的串行异步事件只需要续在try代码块中。
在学习过程中,我疑惑点在于:
1什么是链式调用
之所以叫“链式调用”,是因为每次调用 .then() 或 .catch() 都会返回一个新的 Promise,于是可以继续调用下一个方法,连接成一条链: p1 .then(…) .then(…) .catch(…) 前一个 Promise 的结果,会决定链条后面如何执行。
链条如何传递结果
Promise.resolve(10)
.then(data => {
return data + 5
})
.then(data => {
console.log(data) // 15
})第一个回调返回 15,.then() 会把它包装成一个成功的 Promise,因此第二个 .then() 接收到 15。
如果回调返回另一个 Promise:
Promise.resolve(10)
.then(data => {
return new Promise(resolve => {
setTimeout(() => resolve(data + 5), 1000)
})
})
.then(data => {
console.log(data) // 一秒后输出15
})后面的 .then() 会等待这个 Promise 完成。
2.和同步函数的区别
同步函数调用时,程序会停在这一行,等待函数执行完成:
function task1() {
return 10
}
const data = task1()
console.log(data)执行顺序一定是:
task1执行完成 → 获得data → console.log
普通同步函数的结果可以直接通过 return 获得:
const data = task1()//data = 10Promise 通常用于异步任务。调用后会先得到一个 Promise,而不是立即得到最终数据:
function task1() {
return new Promise(resolve => {
setTimeout(() => resolve(10), 1000)
})
}
const p1 = task1()
console.log(p1) // 立即得到Promise,不是10
p1.then(data => {
console.log(data) // 一秒后得到10
})执行过程是:
启动异步任务 ↓ 立即返回Promise,继续执行后面的同步代码 ↓ 异步任务完成 ↓ 执行then中的回调
真正的区别不是“同步函数不能链式调用”,而是:
- 同步调用:下一步立即处理上一步的返回值。
- Promise 链:下一步等待上一个 Promise 确定结果,然后异步执行对应的回调。
- Promise 链还会自动传递成功值和失败原因。
可以将同步调用理解为:
const a = task1()
const b = task2(a)
const c = task3(b)
Promise 链则类似于:
task1()
.then(task2)
.then(task3)
.catch(handleError)它们都是“前一步结果交给下一步”,但 Promise 链能够表达“现在没有结果,未来得到结果后再继续”。
扩展:基于上面两个疑问,我想知道如何得到p1异步处理之后的值呢?
• 如果你只想等待 p1 得到结果,取出其中某个值,然后结束当前 async 函数,可以使用 await 和 return:
const p1 = new Promise((resolve, reject) => {
setTimeout(() => {
resolve({
name: "小明",
age: 18
})
}, 1000)
})
async function getName() {
const data = await p1
return data.name
}调用 getName():
getName().then(name => {
console.log(name) // 一秒后输出:小明
})按照按执行顺序,可以划分这些事件:
- 同步事件1:创建 p1,启动定时器。
- 同步事件2:定义并调用 getName(),执行到 await p1 后暂停,返回一个等待中的 Promise。
- 同步事件3:调用该 Promise 的 .then(),注册回调函数。
- 异步事件1:定时器结束,调用 resolve();await 得到数据,getName() 返回 “小明”。
- 异步事件2:执行 .then() 的回调,输出 “小明”。 严格来说,异步事件1包含两个不同队列中的任务:
- setTimeout 回调:宏任务
- await 后续代码:微任务 但在初步理解时,可以先将它们合并成一个异步过程。