Quantcast
Channel: CNode:Node.js专业中文社区
Viewing all articles
Browse latest Browse all 14821

【讨论】这个 Promise 模块该怎么写?

$
0
0

今天想写一个模块,但没写出来,所以贴出来集思广益。

目标:解决使用 Promise 时遇到的痛点:有时候需要在 Promise 表达式外定义一个变量存储某一步 .then的结果,比如第三个 .then里面取不到第一个 .then的结果。

最终效果:

Promise.resolve(1)
  .then(function(a) {
    // a === 1
    return Promise.resolve(2)
      .then(function(b) {
        // b === 2
        return 3
      })
      .then(function(c, d) {
        // c === 3
        // d === 2
        return 4
      })
  })
  .then(function(e, f) {
    // e === 4
    // f === 1
  })

可以看出:同一层的 .then的参数是之前所有 .then结果的逆序,里层的 .then最后的结果返回到上层的 .then(跟原生用法一样)。

有以下几点要求:

  1. 以上 Promise.resolve可以换成其他的如:Promise.all等等
  2. hack 原生 Promise,最好第三方 Promise 库也支持,如:bluebird,而不是实现一个新的 Promise
  3. .catch不变

我的思路:

每个 Promise 实例(以 promise 代称)会生成一个随机 _id(不同层的 promise 的 _id 不同),用 _results 存储(unshift)每一步 .then的结果,最后 apply 一下。但后来发现我的做法的前提是认为同层的 promise 的 .then的链式调用是同一个 Promise 实例,然而并不是,每一个 .then都会生成一个新的 Promise 实例,所以此路不通。

上述思路的测试代码:

const shortid = require('shortid');

class myPromise extends Promise {
  constructor(fn) {
    super(fn);
    this._id = shortid.generate();
    this._results = [];
  }
}


const a = myPromise.resolve(1);
console.log(a._id);
console.log(a.then(() => 2)._id);
console.log(a.then(() => 2).then(() => 3)._id);

所以。元芳,你怎么看?


Viewing all articles
Browse latest Browse all 14821

Trending Articles