【发布时间】:2018-12-22 19:38:31
【问题描述】:
我想扩展Promise 并更改then 签名,以便其回调接收两个值。我尝试了不同的方法,其中两种已记录和测试here。遗憾的是,我遇到了各种错误,或者生成的类不像 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);
}
}
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检查
【问题讨论】:
-
改用包装器。你得到什么错误?
ADDITIONAL_DATA定义在哪里,evaluate.bind(data)是什么? -
感谢您的关注。我更新了我最初的帖子,它们只是
function和String,以保持我所有实现的一致性并更好地评估我的测试用例。 -
您遇到什么错误?你能更新你的问题吗?
-
这背后的目标是什么?
-
我建议不要使用
extends Promise,而是从你自己的数据结构开始。将其设为thenable 以提供与承诺的兼容性
标签: javascript promise es6-promise