Повторите обещание, пока оно не будет решено (слишком много ошибок рекурсии)

переопределение зарезервировано для членов-членов для поддержки полиморфного поведения. статические члены класса не относятся к определенному экземпляру. вместо этого статические члены принадлежат классу, и в результате переопределение не поддерживается, поскольку подклассы только наследуют защищенные и публичные экземпляры, а не статические члены. Вы можете захотеть определить шаблоны проектирования и / или стратегии проектирования и / или стратегии для оценки альтернативного подхода.

0
задан Mojimi 18 January 2019 в 13:26
поделиться

2 ответа

Поскольку вас интересует невыполнение обещания, вы можете использовать обработчик catch.

Что касается того, почему ваш код не работает, вот хорошее объяснение некоторыми (также в комментарии):

Вы получаете слишком много рекурсии, потому что 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);

0
ответ дан some 18 January 2019 в 13:26
поделиться

Я попробовал ваш код, но получил 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 выполняется.

0
ответ дан robbannn 18 January 2019 в 13:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: