javascript - 扩展 `Promise` 并更改 `then` 签名
问题描述
我想扩展Promise
和更改then
签名,以便它的回调接收两个值。我尝试了不同的方法,其中两种在此处记录和测试。可悲的是,我收到了各种错误,或者生成的类不像 Promise。
方法 1:包装原生 Promise
export class MyWrappedPromise {
constructor(data) {
this.data = data;
this.promise = new Promise(evaluate.bind(data));
}
then(callback) {
this.promise.then(() => callback(this.data, ADDITIONAL_DATA));
}
catch(callback) {
this.promise.catch(callback);
}
}
方法 2:扩展原生 Promise
export class MyExtendedPromise extends Promise {
constructor(executor, data) {
super(executor);
this.data = data;
}
static create(data) {
return new MyExtendedPromise(evaluate.bind(data), data);
}
then(callback) {
return super.then(() => callback(this.data, ADDITIONAL_DATA));
}
}
有人对我做错了什么有任何建议吗?随意在 GitHub 上创建 PR。
谢谢
- - - - - - - - - - 编辑 - - - - - - - - - - -
一些附加代码和信息,使上面的代码更容易理解,而无需查看 Github 上的代码和测试。
evaluate
只是 Promise 执行器函数。我将其提取出来,以便在我的所有实现和测试中保持一致。它可能看起来很复杂,但它的结构是为了模拟我的“真实”项目。
export function evaluate(resolve, reject) {
const data = this;
function getPromise(data) {
return !!data ? Promise.resolve(data) : Promise.reject(new Error("Error"));
}
getPromise(data)
.then(resolve)
.catch(reject);
}
ADDITIONAL_DATA只是一个字符串,用于模拟回调中的第二个值。它还被提取以在所有版本和测试中保持一致。
------------------- 编辑 2--------------------
根据解决方案出现的错误
catch
不可访问- 很多
UnhandledPromiseRejectionWarning:
警告,因为错误/拒绝没有正确传播。 - 错误/拒绝被过早抛出,甚至没有达到
rejects
我的测试套件中的检查
解决方案
我不太明白为什么你有一个工厂方法,而不是直接使用构造函数。
你的意思是这样的吗?
class MyExtendedPromise extends Promise {
constructor(executor, data) {
super(executor);
this.data = data;
}
then(callback, test) {
console.log('passed new parameter in then:', test);
console.log('additional data:', this.data);
return super.then(data => callback(data, test));
}
}
new MyExtendedPromise((resolve, reject) => {
setTimeout(() => resolve(true), 2000);
}, 'other additional data').then(data => console.log('my then', data), 'hello world');
推荐阅读
- python - 创建类并使其可调用
- python - Print 语句的输出为 (None, None) 结果
- elasticsearch - 弹性搜索 - shingle 令牌过滤器的替代选项
- c++ - C ++ OOP继承,为什么这段代码couts“数据”
- c++ - 在 std::vector 中搜索值
- html - 如何使用beautifulsoup从网页上的特定分区中提取链接
- python - 如何从 UTC 日期时间获取正确的时间戳
- php - 当我上传到网页时登录页面出现问题,在 xampp 中一切正常
- vert.x - vertx-opentracing:排除特定路由的跟踪
- android-studio - 谷歌地图 api 构建失败