美文网首页
Promise的简单理解

Promise的简单理解

作者: 薄荷加冰 | 来源:发表于2019-07-31 20:02 被阅读0次

1. Promise 基本结构

  setTimeout(() => {
    resolve('FULFILLED')
  }, 1000)
})

构造函数Promise必须接受一个函数作为参数,我们称该函数为handle,handle又包含resolve和reject两个参数,它们是两个函数。

定义一个判断一个变量是否为函数的方法,后面会用到

const isFunction = variable => typeof variable === 'function'

首先,我们定义一个名为 MyPromise 的 Class,它接受一个函数 handle 作为参数

  constructor (handle) {
    if (!isFunction(handle)) {
      throw new Error('MyPromise must accept a function as a parameter')
    }
  }
}

2. Promise 状态和值
Promise 对象存在以下三种状态:

Pending(进行中)
Fulfilled(已成功)
Rejected(已失败)

状态只能由 Pending 变为 Fulfilled 或由 Pending 变为 Rejected ,且状态改变之后不会在发生变化,会一直保持这个状态。

Promise的值是指状态改变时传递给回调函数的值

上文中handle函数包含 resolve 和 reject 两个参数,它们是两个函数,可以用于改变 Promise 的状态和传入 Promise 的值

  setTimeout(() => {
    resolve('FULFILLED')
  }, 1000)
})

这里 resolve 传入的 "FULFILLED" 就是 Promise 的值
resolve 和 reject
resolve : 将Promise对象的状态从 Pending(进行中) 变为 Fulfilled(已成功)
reject : 将Promise对象的状态从 Pending(进行中) 变为 Rejected(已失败)
resolve 和 reject 都可以传入任意类型的值作为实参,表示 Promise 对象成功(Fulfilled)和失败(Rejected)的值

了解了 Promise 的状态和值,接下来,我们为 MyPromise 添加状态属性和值

首先定义三个常量,用于标记Promise对象的三种状态

const PENDING = 'PENDING'
const FULFILLED = 'FULFILLED'
const REJECTED = 'REJECTED'

再为 MyPromise 添加状态和值,并添加状态改变的执行逻辑

  constructor (handle) {
    if (!isFunction(handle)) {
      throw new Error('MyPromise must accept a function as a parameter')
    }
    // 添加状态
    this._status = PENDING
    // 添加状态
    this._value = undefined
    // 执行handle
    try {
      handle(this._resolve.bind(this), this._reject.bind(this)) 
    } catch (err) {
      this._reject(err)
    }
  }
  // 添加resovle时执行的函数
  _resolve (val) {
    if (this._status !== PENDING) return
    this._status = FULFILLED
    this._value = val
  }
  // 添加reject时执行的函数
  _reject (err) { 
    if (this._status !== PENDING) return
    this._status = REJECTED
    this._value = err
  }
}

这样就实现了 Promise 状态和值的改变。下面说一说 Promise 的核心: then 方法

3. Promise 的 then 方法
Promise 对象的 then 方法接受两个参数
promise.then(onFulfilled, onRejected) 参数可选

onFulfilled 和 onRejected 都是可选参数。

如果 onFulfilled 或 onRejected 不是函数,其必须被忽略

onFulfilled 特性 如果 onFulfilled 是函数:

当 promise 状态变为成功时必须被调用,其第一个参数为 promise 成功状态传入的值( resolve 执行时传入的值)
在 promise 状态改变前其不可被调用
其调用次数不可超过一次

onRejected 特性 如果 onRejected 是函数:

当 promise 状态变为失败时必须被调用,其第一个参数为 promise 失败状态传入的值( reject 执行时传入的值)
在 promise 状态改变前其不可被调用
其调用次数不可超过一次
多次调用 then 方法可以被同一个 promise 对象调用多次

当 promise 成功状态时,所有 onFulfilled 需按照其注册顺序依次回调
当 promise 失败状态时,所有 onRejected 需按照其注册顺序依次回调

返回then 方法必须返回一个新的 promise 对象

promise2 = promise1.then(onFulfilled, onRejected);

因此 promise 支持链式调用

promise1.then(onFulfilled1, onRejected1).then(onFulfilled2, onRejected2);

相关文章

  • 简单理解Promise

    概念 我理解的Promise就是一套为处理异步情况的方法。先创建一个promise对象来注册一个委托,其中包括委托...

  • promise的简单理解

    构造函数 上面的这个 function() 是会立刻被执行的。 resolve 和 reject 上面的函数中,可...

  • Promise的简单理解

    1. Promise 基本结构 构造函数Promise必须接受一个函数作为参数,我们称该函数为handle,han...

  • Promise的简单理解

    1、Promise概述 比较官方的介绍就是:Promise是异步编程的一种解决方案。从语法上说,Promise 是...

  • Promise的简单理解

    那么 promise的结构是什么呢 demo实例: /** 检查微信会话是否过期*/ 简单的promise实例 p...

  • 八(1)、Promise(周) ------ 2020-02-2

    1、什么是Promise: 2、通过原生JS实现简单的Promise原理,理解Promise如何管控异步编程: 3...

  • Lesson-11 ES6 高级语法(2)

    Promise 我觉得可以简单的把promise理解成一个拥有状态的队列,promise拥有三个状态Pending...

  • 完全理解 Promise 实现

    完全理解 Promise 基本实现 网上有很多 Promise 实现方式,看了都不是特别理解。这里以一种更简单的形...

  • js:Promise的简单理解

    层面上的理解:Promise是一个类,有3个状态分别是:等待态(默认) 成功态 失败态 打个比方比如承诺要给...

  • 手写极简版promise

    为了更更加好的理解promise ,简单的学习了一下手写promise。于是我就简单的学了一下 ,首先分步操作,先...

网友评论

      本文标题:Promise的简单理解

      本文链接:https://www.haomeiwen.com/subject/bekxdctx.html