Я хочу расширить Promise
и изменить подпись then
, чтобы его обратный вызов получил два значения.Я пробовал разные подходы, два из которых задокументированы и протестированы здесь .К сожалению, я получаю различные ошибки, или полученный класс не ведет себя как Обещание.
Подход 1: Упаковка собственного Обещания
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: Расширение родных обещаний
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));
}
}
Есть ли у кого-нибудь какие-либо предположения о том, что я делаю неправильно?Не стесняйтесь создавать PR на GitHub.
спасибо
------------------- Редактировать ---------------------
Некоторые дополнительные коды и информация, чтобы сделать приведенный выше код более понятным, не глядя на код и тесты на 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
в моих тестовых пакетах