gpt4 book ai didi

javascript - 扩展 `Promise` 并更改 `then` 签名

转载 作者:数据小太阳 更新时间:2023-10-29 05:24:24 24 4
gpt4 key购买 nike

我想延长Promise并更改 then签名所以它的回调接收两个值。我尝试了不同的方法,其中两种已记录并经过测试 here .遗憾的是,我遇到了各种错误,或者生成的类的行为不像 Promise。

方法一:Wrapping a native 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:Extending native Promises

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检查我的测试套件

最佳答案

您遇到问题(尤其是未处理的拒绝)是因为您没有正确实现 then 接口(interface)。请记住,.catch(onRejected) 只是 .then(undefined, onRejected)then with two parameters 的别名。是实际的 core method of every promise .

您总是忽略第二个参数,因此没有处理任何拒绝。你需要写

then(onFulfilled, onRejected) {
return super.then(res => onFulfilled(res, this.ADDITIONAL_DATA), onRejected);
// or `this.promise.then` instead of `super.then`
}

关于javascript - 扩展 `Promise` 并更改 `then` 签名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53883423/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com