Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

图解Promise #29

Open
HerryLo opened this issue Feb 18, 2021 · 0 comments
Open

图解Promise #29

HerryLo opened this issue Feb 18, 2021 · 0 comments
Assignees
Labels
Blog 文章

Comments

@HerryLo
Copy link
Member

HerryLo commented Feb 18, 2021

作者:HerryLo
博客原文链接

Promises对象被用于表示一个异步操作的最终完成 (或失败), 及其结果值。主要是为了解决异步操作的问题。

一个 Promise对象有以下三种状态:

pending: 初始状态,既不是成功,也不是失败状态。
fulfilled(resolved): 意味着操作成功完成。
rejected: 意味着操作失败。

Promise对象内部运行的一个变化, 变化如下:

1. 当new Promise()被实例化后,即表示Promise 进入pending初始化状态,准备就绪,等待运行。
2. 一旦Promise实例运行成功或者失败之后,实例状态就会变为fulfilled 或者 rejected,此时状态就无法变更。

Promise实例流程

Promise实例函数调用流程基本如下图所示:

内部主要就是状态的变化,在状态为padding时,会等待执行,一旦非padding态,就会运行存放在数组中的函数。

运行代码示例

处理非异步情况:

var p = new Promise(function (resolve, reject) {
    resolve('Promise');
})
p.then((result) => {
    console.log(1)
})
p.then((result) => {
    console.log(2)
});

先实例化Promise,同时执行完回调函数,状态由pedding 变为 fullilled,Promise实例回调函数执行完成。(此时并不会将then回调函数保存,函数顺序执行)

继续执行,保存then回调,发现Promise状态已经变为fullilled,then回调直接运行。(这里的两个then回调都是这样)

处理异步情况:

var p = new Promise(function (resolve, reject) {
    setTimeout(()=> {
        console.log('setTimeout');
        resolve('Promise')
    },1000)
})
p.then((result) => {
    console.log(1)
})
p.then((result) => {
    console.log(2)
});

先实例化Promise,同时执行完回调函数,由于是setTimeout函数,回调函数进入任务队列,状态依然还是pedding ,Promise实例回调函数执行完成,继续执行其他同步函数。(此时并不会将then回调函数保存)

继续执行,保存then回调,发现Promise状态还是pedding,then回调被保存在数组中,then回调保存完毕。执行setTimeout回调函数,执行被保存在数组中的then回调。

提示:then/catch 都是一个 Promise

这就是Promise的基本运作,有兴趣可以看看Promise源码解析

参考:

Promise源码

ecma262: Promise Abstract Operations

ps: 微信公众号:Yopai,有兴趣的可以关注,每周不定期更新。不断分享,不断进步

@HerryLo HerryLo self-assigned this Feb 18, 2021
@HerryLo HerryLo added the Blog 文章 label Feb 16, 2022
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Blog 文章
Projects
None yet
Development

No branches or pull requests

1 participant