MarginLon MarginLon
首页
  • Web

    • Web基础
    • Web布局
    • CodeSnippet
  • Vue

    • Vue
  • React

    • React
  • Node.js

    • Node.js
  • 技术文档
  • UI组件库
  • 动画库
  • 图形库
  • 桌面端
  • 学习笔记
  • 生活笔记
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

MarginLon

http://info.cern.ch
首页
  • Web

    • Web基础
    • Web布局
    • CodeSnippet
  • Vue

    • Vue
  • React

    • React
  • Node.js

    • Node.js
  • 技术文档
  • UI组件库
  • 动画库
  • 图形库
  • 桌面端
  • 学习笔记
  • 生活笔记
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • 数据类型 类型检测 类型转换
  • 精度问题
  • 堆栈内存 函数底层运行机制 块级作用域
  • GC机制 闭包作用域 let/const/var
  • 闭包应用
  • DOM
  • BOM
  • This指向
  • 浏览器渲染机制 CRP优化 事件循环机制
  • 函数防抖节流
  • 模块化 柯里化
  • 构造函数 原型
  • CLASS
  • 工厂设计模式 深浅拷贝 深浅合并
  • Iterator/Generator
  • Promise/ Async/ Await
    • 1. Promise
    • 2. Async/Await
  • HTTP/跨域
  • API
  • AJAX
  • 事件
  • 《JavaScript高级程序设计(第4版)》
MarginLon
2022-04-30
目录

Promise/ Async/ Await

# 1. Promise

  • Promise

    // PromiseState: pending/fulfilled/rejected
    // PromiseResult: undefined
    // new Promise(executor) 立即执行传递的executor函数
    /*
      实例.then(onfulfilled,onrejected)
        1. 观察实例状态,如果已知成功或者失败
          + 创建一个异步的“微任务”[放在webapi监听,监听时知道状态,所以直接把执行的哪个方法,挪至EventQueue中排队等待]
          + 状态成功执行onfulfilled
          + 状态失败执行onrejected
        2. 如果此时状态是pending
          + 把onfulfilled/onrejected存储到指定容器中 [放在WebAPI监听状态改变]
          + 执行resolve/reject时
            + 立即修改实例的状态和值[同步]
            + 创建一个异步微任务,让指定容器中的方法执行 [挪至EventQueue中等待]
      
      new Promise产生的实例,状态是成功还是失败,由 executor执行是否报错{执行报错,则实例是失败态}、以及resolve还是reject执行决定
      Promise.resolve(100):直接创建状态是成功的实例
      Promise.reject(100):直接创建状态是失败的实例
    
      "实例.then"会返回一个全新的promise实例p2,这个实例的成功失败,由p1管控的onfulfilled或者onrejected不论哪个方法执行决定:
        + 方法执行是否返回新的promise实例,如果没有返回:
          + 方法执行不报错,p2成功,值是函数返回值
          + 报错,p2失败,值是报错原因
        + 如果返回新的promise,则新promise[p3]的状态和值决定了p2的状态和值
      then的穿透机制
        + onfulfilled和onrejected,可传可不传,不传则顺延到下一个then中。
      .all/any/race
      
      执行Promise.resolve/reject/all/any/race...等静态私有方法也会创建新的promise实例
    */
    let p1 = new Promise(function executor(resolve, reject){
      resolve(100);
      // reject(0);
    });
    p1.then(function onfulfilled(value){
        console.log('OK',value);
    }, function onrejected(reason){
        console.log('No',reason);
    });
    
    p1.then(value =>{}).catch(reason =>{});
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41

# 2. Async/Await

/*
 * - async/await : promise + generator
 *  + async修饰的函数,默认返回值会变成一个promise实例
 *  + 必须在函数中使用await,当前函数需要async修饰
*/
(async function(){
    // await 后面放置 promise实例 [如果不是,则默认变为状态成功,值为此值的promise]
    // 把当前上下文中,await下面的代码作为一个异步微任务,放在webAPI中监听,监听实例状态
    // 如果状态成功,则把下面的代码挪至EventQueue中排队
    // 如果状态失败,则下面代码不会执行
    let value = await p1;
})();

(async function () {
    // 捕获await后面实例是失败的?
    try {
        let value = await p1;
        console.log('成功:', value);
    } catch (err) {
        console.log('失败:', err);
    }
})(); 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
编辑 (opens new window)
上次更新: 2023/04/01, 15:26:22
Iterator/Generator
HTTP/跨域

← Iterator/Generator HTTP/跨域→

最近更新
01
KnockoutJS
11-12
02
综述
10-17
03
前言
10-12
更多文章>
Theme by Vdoing | Copyright © 2019-2024 MarginLon | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式