Promise的基本使用方法

这篇博客详细介绍了Promise的原理和使用,包括Promise的三种状态、API、链式调用、异常处理以及并行执行。通过实例解析了Promise如何解决回调地狱问题,并对比了Promise与Async/Await的异步编程解决方案。
摘要由CSDN通过智能技术生成

Promise的概述

 

  • Promise存在三种状态,及承诺开始pending,承诺兑现fulfilled以及承诺失败rejected。
  • 承诺的状态一旦确定就不可在被改变,即当状态为fulfilled时,此时promise的状态就不可再变为rejected,反之同样。
  • fulfilled与rejected存在onFulfilled和onRejected状态。

什么是promise?

抽象表达:Promise 是JS 中进行异步编程的新的解决方案
具体表达:Promise 是一个构造函数,promise对象用来封装一个异步操作并可以获取其结果

promise诞生的意义是什么,为什么会有promise?

  1. 指定回调函数的方式更加灵活
    promise之前:必须在启动异步任务前指定
    promise:启动异步任务=> 返回promie 对象=> 给promise 对象绑定回调函
    数(甚至可以在异步任务结束后指定/多个)
  2. 支持链式调用, 可以解决回调地狱问题
    什么是回调地狱? 回调函数嵌套调用, 外部回调函数异步执行的结果是嵌套的回调函数执行的条件
    回调地狱的缺点? 不便于阅读/ 不便于异常处理
    解决方案? promise 链式调用
    终极解决方案? async/await

promise的Api有哪些?

  1. Promise 构造函数: Promise (excutor) {}
  2. Promise.prototype.then 方法: (onResolved, onRejected) => {}
  3. Promise.prototype.catch 方法: (onRejected) => {}
  4. Promise.resolve 方法: (value) => {}
  5. Promise.reject 方法: (reason) => {}
  6. Promise.all 方法: (promises) => {}
  7. Promise.race 方法: (promises) => {}

Promise的基本用法

// Promise 基本示例

const promise = new Promise(function (resolve, reject) {
  // 这里用于“兑现”承诺

  // resolve(100) // 承诺达成

  reject(new Error('promise rejected')) // 承诺失败
})

promise.then(function (value) {
  // 即便没有异步操作,then 方法中传入的回调仍然会被放入队列,等待下一轮执行
  console.log('resolved', value)
}, function (error) {
  console.log('rejected', error)
})

console.log('end')

Promise的使用案例

// Promise 方式的 AJAX

function ajax (url) {
  return new Promise(function (resolve, reject) {
    var xhr = new XMLHttpRequest()
    xhr.open('GET', url)
    xhr.responseType = 'json'
    xhr.onload = function () {
      if (this.status === 200) {
        resolve(this.response)
      } else {
        reject(new Error(this.statusText))
      }
    }
    xhr.send()
  })
}

ajax('/api/foo.json').then(function (res) {
  console.log(res)
}, function (error) {
  console.log(error)
})

Promise的常见误区

// Promise 常见误区

function ajax (url) {
  return new Promise(function (resolve, reject) {
    var xhr = new XMLHttpRequest()
    xhr.open('GET', url)
    xhr.responseType = 'json'
    xhr.onload = function () {
      if (this.status === 200) {
        resolve(this.response)
      } else {
        reject(new Error(this.statusText))
      }
    }
    xhr.send()
  })
}

// 嵌套使用 Promise 是最常见的误区
ajax('/api/urls.json').then(function (urls) {
  ajax(urls.users).then(function (users) {
    ajax(urls.users).th
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值