【问题标题】:asking for help fixing a broken promise chain寻求帮助修复损坏的承诺链
【发布时间】:2020-05-06 21:58:33
【问题描述】:

这是承诺链。我觉得它看起来不错,但它并没有像我想要的那样工作。我已经看过了,一切似乎都井井有条。作为新手,我是否只是在 .then 的每次新迭代中重复 poem?我正在前往.catch,因为它会打印出“出了点问题”,我希望得到任何建议!


let poem = 'But I must explain to you how all this mistaken idea of denouncing pleasure and praising pain was born and I will give you a complete account of the system, and expound the actual teachings of the great explorer'

const poemJudge = (poem) => {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            if(poem.length > 25){
                console.log('We need to review this poem further');
                resolve(poem);
            } else {
                reject('woah what? way too elementary');
            }
        }, generateRandomDelay());
    });
};

const keepThinking = (resolvedPoem) => {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            if(resolvedPoem.length < 45) {
                console.log('terse, but we must deliberate further');
                resolve(resolvedPoem);
            } else {
                reject('seriously? the poem is way too long!');
            }
        }, generateRandomDelay())

    });
};

const KeepOnThinking = (secondResolvedPoem) => {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            if(secondResolvedPoem < 40 && secondResolvedPoem > 30) {
                console.log('Nailed it')
                resolve(secondResolvedPoem);
            } else {
                reject('you are top 50 at least')
            }
        }, generateRandomDelay());
    });
};


poemJudge(poem)
.then((resolvedPoem) => {
    return keepThinking(resolvedPoem);
})
.then((secondResolvedPoem) => {
    return keepOnThinking(secondResolvedPoem);
})
.then(() => {
    console.log('you have completed the poem challenge');
})
.catch(() => {
    console.log('something went wrong');
});

【问题讨论】:

  • 记录传递给catch 的错误是个好主意。在这种情况下,错误是something went wrong ReferenceError: generateRandomDelay is not defined

标签: javascript ecmascript-6 promise es6-promise chain


【解决方案1】:

假设您在代码中定义了方法 generateRandomDelay。

当你调用reject() 时,一个promise 失败并且它被捕获在一个.catch 块中。 在这个例子中,这首诗的长度是 > 25 和

  1. poemJudge 解决了它
  2. keepThinking 拒绝它
  3. 您的 catch 块捕获了拒绝。

您可以通过记录您在 catch 块中收到的消息 (err) 来确认这一点:

poemJudge(poem)
.then((resolvedPoem) => {
    return keepThinking(resolvedPoem);
})
.then((secondResolvedPoem) => {
    return keepOnThinking(secondResolvedPoem);
})
.then(() => {
    console.log('you have completed the poem challenge');
})
.catch(err => {
    console.log(err);
});

您的控制台将打印:

我们需要进一步复习这首诗

真的吗?这首诗太长了!

【讨论】:

  • 我可以确认这一点。 keepThinking() 拒绝您的承诺,这会将您的流程带到 catch()