Promise异步流控制

454 阅读2分钟

这是我参与8月更文挑战的第28天,活动详情查看:8月更文挑战

前言

“八月的色彩是用金子铸就的,明亮而珍贵;八月的色彩是用阳光酿造的,芬芳而灿烂。”

未来的日子,愿你把自己调至最佳状态,缓缓努力,慢慢变好 Y(^o^)Y

ES6 增加了一个新的特性来帮助解决只有回调实现异步的严重缺陷:Promise

Promise不是对回调的替代,Promise在回调代码和将要执行这个任务的异步代码之间提供了一种可靠的中间机制来管理回调。

构造和使用Promise

可以通过构造器 Promise() 构造Promise 示例:

const P = new Promise(function(resolve, reject) {
  // ...
})

提供给构造器Promise()的两个参数,一般称之为resolve()reject(),它们的使用方式主要是以下三种情况:

  • 如果调用reject(),这个Promise被拒绝,如果有值传个reject(),这个值就被设置为拒绝的原因值
  • 如果调用resolve()且没有值传入,或者传入任何非Promise值,这个Promise就完成。
  • 如果调用resolve()并传入另外一个Promise,这个Promise就会采用传入的Promise的状态(拒绝或者实现)
function ajax(url) {
  return new Promise(function pr(resolve, reject) {
    // 建立请求,最终会调用resolve()或者reject()
  })
}
// ...
ajax('http://......url')
.then(
  function fulfilled(res) {
    // 处理res成功情况
  },
  function rejected(res) {
    // 处理ajax出差原因
  }
)

Promise有一个then()方法,接受一个或者两个回调函数作为参数。第一个函数会作为Promise成功完成后的处理函数,第二个函数会作为Promise被显式拒绝后的处理函数,或者是过程中出现错误/异常的情况下的处理函数。

Promise API

Promise API 还提供了一些静态方法与 Promise一起工作。

Promise.resolve(...)

Promise.resolve(...) 创建一个决议到传入值的Promise

const p1 = Promise.resolve(66);

const p2 = new Promise(function pr(resolve) {
  resolve(66)
})

p1p2的最终行为方式是完全相同的。

Promise.reject(...)

Promise.reject(...)Promise.resolve(...)类似。

Promise.all([...])

Promise.all([...])接受一个或多个值的数组。它返回同一个Promise,如果所有的值都完成,这个Promise的结果是完成,一旦它们中的某一个被拒绝,那么这个Promise立刻被拒绝。

Promise.race([...])

Promise.race([...])等待第一个完成或者拒绝。

结语

如果这篇文章帮到了你,欢迎点赞👍和关注⭐️。

文章如有错误之处,希望在评论区指正🙏🙏。