【Promise 规范】resolve 和 then 方法主要逻辑

Promise

Promise 表示一个异步操作的状态和结果。通过 Promise规范 来学习其实现过程,有利于我们更好地掌握和使用它。

resolve 方法

  • 如果 Promise 是 pending,则将状态改为 fulfilled
  • 将 Promise 的 value 赋值为 resolve 参数
  • 如果有 onFulfilledCallback,则将其推到微队列中(onFulfilledCallback 见下文)

then 方法

例子

现在让我们通过一个例子,来理解上面的内容。请回答以下程序的打印内容。

setTimeout(() => {
  console.log(0)
}, 0);

let p1 = new Promise((resolve, reject) => {
  resolve({name: 1})
})

let p2 = p1.then(
  () => {
    console.log(1)
  }
)

let p3 = p2.then(value => {
  console.log(2)
})

let p4 = new Promise((resolve, reject) => {
    resolve('Promise')
})

let p5 = p4.then(
  value => {
    console.log(3)
  },
  error => console.log(error)
)

let p6 = p5.then(value => {
  console.log(4)
})

console.log(5)

解析

// 1. 把定时器任务推到宏队列中
// 13.执行宏队列,打印 0
setTimeout(() => {
  console.log(0)
}, 0);

// 2. 调用 resolve,此时 p1 的状态变为 fulfilled
let p1 = new Promise((resolve, reject) => {
  resolve({name: 1})
})

// 3. 执行 then,把 onFulfilled 推到微队列
// 9. 执行微队列,打印 1
// 9. p2 状态变为 fulfilled, 将 p2 的 onFulfilledCallback 推到微队列
let p2 = p1.then(
  () => {
    console.log(1)
  }
)

// 4. 执行 then,p2 是 pending 状态,所以保存 onFulfulled 到 P2 的 onFulfilledCallback 中
// 11. 执行微队列,打印 2
let p3 = p2.then(value => {
  console.log(2)
})

// 5. 调用 resolve,此时 p4 的状态变为 fulfilled
let p4 = new Promise((resolve, reject) => {
    resolve('Promise')
})

// 6. 执行 then,把 onFulfilled 推到微队列
// 10. 执行微队列,打印 3
// 10. p5 状态变为 fulfilled, 将 p5 的 onFulfilledCallback 推到微队列
let p5 = p4.then(
  ()=> {
    console.log(3)
  },
  error => console.log(error)
)

// 7. 执行 then,p5 是 pending 状态,所以保存 onFulfulled 到 p5 的 onFulfilledCallback 中
// 12. 执行微队列,打印 4
let p6 = p5.then(value => {
  console.log(4)
})

// 8. 输出 5
console.log(5)

打印结果:5 1 3 2 4 0

参考资料

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
ES6(ECMAScript 2015)引入了Promise对象,它是一种异步编程的解决方案。当一个异步操作完成后,Promise对象会返回一个代表操作结果的值,而不是像传统方式那样使用回调函数。 Promise对象的then方法用于指定操作成功和失败时的回调函数。而且可以将then方法连续使用,形成链式调用。当一个Promise对象的then方法返回另一个Promise对象时,后续的then方法都会等待该Promise对象的状态改变。 链式调用的好处在于减少了回调函数嵌套的层数,提高了代码的可读性和可维护性。通过then方法的链式调用,可以构建一串异步操作,使得代码逻辑更加清晰。 例如: ``` function getJSON(url) { return new Promise((resolve, reject) => { const xhr = new XMLHttpRequest(); xhr.open('GET', url); xhr.onreadystatechange = function() { if (xhr.readyState === 4) { if (xhr.status === 200) { resolve(JSON.parse(xhr.responseText)); } else { reject(new Error('Unable to fetch data')); } } }; xhr.send(); }); } getJSON('/data/user.json') .then(user => { return getJSON(`/data/profile/${user.id}.json`); }) .then(profile => { console.log(profile); }) .catch(error => { console.error(error); }); ``` 上述代码展示了一个获取用户信息和个人资料的异步操作,其中getJSON函数返回一个Promise对象。通过then方法的链式调用,可以先获取用户信息,然后再获取个人资料。如果有任何一个异步操作失败,则会进入catch回调函数。
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值