переопределение зарезервировано для членов-членов для поддержки полиморфного поведения. статические члены класса не относятся к определенному экземпляру. вместо этого статические члены принадлежат классу, и в результате переопределение не поддерживается, поскольку подклассы только наследуют защищенные и публичные экземпляры, а не статические члены. Вы можете захотеть определить шаблоны проектирования и / или стратегии проектирования и / или стратегии для оценки альтернативного подхода.
Поскольку вас интересует невыполнение обещания, вы можете использовать обработчик catch.
Что касается того, почему ваш код не работает, вот хорошее объяснение некоторыми (также в комментарии):
Вы получаете слишком много рекурсии, потому что
blockquote>tryUntilThree
называется слишком много раз. Обратите внимание, что вы написалиtryUntilThree(x+1)
, т.е. движок должен разрешить вызов наtryUntilThree
, прежде чем он сможет позвонитьnonPromiseCallback
. У вас там бесконечный цикл.
function nonPromiseCallback(x, resolve, reject){ if(x < 3){ reject(x) }else{ resolve(x) } } function tryUntilThree(x){ return new Promise( (resolve, reject) => nonPromiseCallback(x, resolve, reject) ).catch(() => tryUntilThree(x + 1) ) } tryUntilThree(1) .then(console.log);
Я попробовал ваш код, но получил TypeError: reject is not a function
. Это потому, что вы передаете tryUntilThree(x+1)
, который выполняет функцию, прежде чем передать ее в nonPromiseCallback
.
Итак, я придумал этот код, чтобы попытаться выполнить то, что вы хотите.
let res; // used for keeping a reference to the original resolve
function nonPromiseCallback(x, resolve, reject){
if(x < 3){
reject(x + 1);
}
else{
resolve(x);
}
}
function tryUntilThree(x){
return new Promise((resolve) => {
if(!res){
res = resolve;
}
nonPromiseCallback(x, res, tryUntilThree);
});
}
tryUntilThree(1)
.then(res => console.log("RESULT:", res));
let res;
, эта переменная используется для хранения ссылки на исходное разрешение, так что .then
выполняется.