今天想写一个模块,但没写出来,所以贴出来集思广益。
目标:解决使用 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
(跟原生用法一样)。
有以下几点要求:
- 以上
Promise.resolve
可以换成其他的如:Promise.all
等等 - hack 原生 Promise,最好第三方 Promise 库也支持,如:bluebird,而不是实现一个新的 Promise
.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);
所以。元芳,你怎么看?