#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