美文网首页
JS笔记-promise

JS笔记-promise

作者: areece | 来源:发表于2020-06-11 09:02 被阅读0次

基本概念比灵活的运用更加重要。理解了基本概念,才不会在数量巨大的名词前迷失。

Javascript的promise的概念有时候,容易让人迷惑。我们从网上找了一段又一段的示例代码,希望以此来让知道搞清楚,到底promise是什么。但是我们还是在promise的各种概念中,不知所措。

在下面的描述中,一般不关注reject。reject的过程其实是和fullfill类似。

fullfilled与resolve的区别

fullfilled是一个状态。当状态为fullfilled的时候,promise已经达到了一个值,而且这个值不会再更改了。而resolve是一个过程,当resolve时,是否fullfilled,还要,嗯,看情况。我们需要讨论讨论,研究研究。

一些简单的背景

promise是未来事件的封装

这是容易理解的一部分,就是现在还没有发生的一件事情,将来会发生。

通过then方法注册未来事件的回调

这个也容易理解,就是fullfilled时或者rejected时要调的回调函数,是通过promise.then(onFulfilled, onRejected)进行处理。

resolve的过程

按照规范,then方法返回一个promise。所以形式上应该写成

promise2 = promise1.then(onFullfilled, onRejected)

不简单的事情

不简单的就是onFullfilled的不同,而处理会非常地不同,这也是promise容易把人搞昏头的地方。

形式1,onFullfilled是函数

那么当它返回一个值x时,要走[[resolve]](promise1, x)的流程。

形式2,onFullFilled不是函数

那么如果promise1 fullfilled的时候,promise2也fullfilled了。也就是promise要跟随promise1的fullfilled状态。
问题又来了,如果这时候promise1没有fullfilled怎么办呢,我们就说,不可能,因为如果promise1没有fullfilled,就不会来调用它的then方法,也就不会来检查onFullFilled参数是个什么东西。

resolve流程

也得分两种情况,x如果是thenable,也就是它得有一个then这样的方法,也就是说象是一个promise的对象。如果不是,情况简单,直接将x作为fullfilled的值。

thenable的处理流程

又细分为两种情况,一种是x是promise

  • 如果x已经不是处于pending状态,则一直要等待x不处于pending状态再做决定。也就更说promise2这时候,也得是pending状态。
  • 如果x已经是fullfilled,则promise2也会以相同的值fullfill。
  • 如果x已经是rejected了,同理。

另外一种情况是x是一个object。流程也很清晰的:

  • 首先获取y=x.then
  • 如果y不是function,拿它来fullfill我们的promise2
  • 这时候,y肯定是一个function了,又得来调用它了,这时候,其实和构造Promise差不多的,又是新一轮的循环。

兜底的catch

在处理的流程内部,无论何时出现了异常,都能够catch住,也就是onRejected会被调用。

相关文章

  • JS笔记-promise

    基本概念比灵活的运用更加重要。理解了基本概念,才不会在数量巨大的名词前迷失。 Javascript的promise...

  • 如何从无到有实现Promise(上)

    前言 最近整理了两篇关于js异步的笔记,谈到异步就不得不说说 Promise。Promise 取代传统回调方式实现...

  • 异步

    JavaScript异步编程解决方案笔记 JavaScript Promise迷你书 Node.js回调黑洞全...

  • 杂记

    有C,OC,JS,有面试题,有笔记,有学习知识,不系统,很杂 Node.js最新技术栈之Promise篇

  • 手写Promise

    基本实现new Promise 和 then /catch方法 Promise.js test.js测试 调用手...

  • js-Promise基础

    js-Promise基础(第三周) Promise含义 promise意思为允诺、许诺、承诺在js中为了解决编写代...

  • RN-ErrorUtils处理崩溃、promise错误

    ErrorUtils.js路径 promise路径 ErrorUtils使用 promise使用

  • js Promise实现笔记

    V8引擎的实现源码:promise.js非官方实现,来自:Promise实现原理(附源码)注:啃官方源码和其他原型...

  • Promise,async,await笔记

    Promise,async,await笔记 Promise 创建promise对象 Promise对象构造方法传入...

  • Promise原理解析

    Promise原理解析 标签(空格分隔): Node.js Promise原理解析 简介 Promise 对象用于...

网友评论

      本文标题:JS笔记-promise

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