Почему этот рекурсивный улов иногда становится неопределенным для .затем параметр?

#javascript #es6-promise

#javascript #es6-обещание

Вопрос:

Я новичок в отладке асинхронного кода и теряюсь в потоке отладчика. Можете ли вы определить, почему параметр приветствия в .then(приветствие) иногда не определен?

 var tomsGreet = "Hello"

var thinkSomething = (idea) => {
  console.log("I'm thinking")
  return new Promise((fulfill, reject)=>{
    if(Math.round(Math.random() * 1))
      {
        fulfill("Hello Tom, how is your "   idea)
      }
    else{
      reject("Error found")
    }
    fulfill("Hello Tom, how is your "   idea)
  })
}

var respondToTom = (response) => {
    return this.thinkSomething("dog")
        .catch((error) => {
            console.warn(`Error in thinking`)
            if (error === 'Error found') {
                console.log(`Retrying thinking`)
                return this.respondToTom(this.tomsGreet)
            }
            else { throw error; }
        })
        .then((greet) => {
            if (greet == undefined){
              console.error("Ups undefined")
            }
            console.log(greet)
        });
}

this.respondToTom(tomsGreet);  

Ответ №1:

Когда вы рекурсивно вызываете responseToTom() из .catch() обработчика, вы полагаетесь на тот факт, что responseToTom() он вернет обещание, которое преобразуется в значение. Но в этом коде:

     .then((greet) => {
        if (greet == undefined){
          console.error("Ups undefined")
        }
        console.log(greet)
    });
  

Вы не возвращаете никакого значения, поэтому оно всегда будет преобразовываться в undefined значение. Вероятно, вы хотите добавить return greet к этому .then() обработчику.

Ответ №2:

Измените, чтобы поместить .catch after .then

 var respondToTom = (response) => {
    return thinkSomething("dog")
    .then((greet) => {
        if (greet == undefined){
            console.error("Ups undefined")
        }
        console.log(greet)
    })
    .catch((error) => {
        console.warn(`Error in thinking`)
        if (error === 'Error found') {
            console.log(`Retrying thinking`)
            return respondToTom(tomsGreet)
        } else {
            throw error;
        }
    })
}
  

Комментарии:

1. Если я сделаю это, и что-то не получится в then , я бы не знал, где источник сбоя был в thinkSomething или в .then , не так ли?

2. Не напрямую, но: — в вашем текущем нет реального риска .then , и вы выполнили тест в catch