JS Promise

45 阅读1分钟

为什么会有异步操作, JS 的运行依赖一个单线程的事件循环模型. 异步操作是为了优化长耗时任务对系统的负面影响, 同时也让待任务队列有了优先级的概念.

早期的异步处理主要依赖回调 callback 完成, 但是串联执行多个异步方法的逻辑, 就会导致深的代码嵌套 ( 回调地狱 ).

为了优化回调地狱, ES6 正式提出了 Promise 标准. Promise 本质上维护了一个容器, 对内管理异步任务, 对外提供同步编程的代码结构, 通过链式操作来支持异步逻辑的顺序执行.

创建 Promise 对象的时候会要求传入一个执行器方法, 这个方法会立即执行, 且此时 Promise 对象为 pending 状态. 执行器方法有两个参数方法: resolve 和 reject, 通过这两个方法可以分别将 pending ⇒ resolvedpending ⇒ rejected .

但是 Promise 也是有缺陷的, 因为大量的逻辑还是需要写在 then 方法中, then 方法之间共享信息还需要设置外层变量. 于是 ES8 又提出了异步函数的概念 (async / await) , 旨在用同步的方式去编写异步逻辑, 降低心智负担.

终止 Promise 链

在 then 方法中返回一个 pending 状态的 Promise, 就可以阻止后续所有的 then 和 catch 执行

new Promise((rs, _rj) => {
  rs(0)
})
    .then(res => {
      console.log("hello 1: ",res); // hello 1:  0
      return 1
    })
    .then(res => {
      console.log("hello 2: ", res); // hello 2:  1
      return new Promise(() => {}); // 返回一个 Promise<Pending> 以终断链
    })
    .then(res => {
      console.log("hello 3: ", res); // 不再执行
    })
    .catch(err => {
      console.log("err catch: ", err);
    })

现在再看一下异步函数, 用异步函数操控复杂的异步逻辑会更得心应手.