更清楚的方法来捕获嵌套承诺链中的错误?

时间:2017-07-10 03:27:21

标签: javascript ecmascript-6 promise

我是处理promises的新手,并注意到,为了在嵌套的promises链中捕获错误,我需要在链中的每个promise上调用catch方法。是否有更清晰的方式来写这个?

      poll.pollForCandidates().then((candidates) => {
        let clientId = candidates[0].clientId;
        poll.getUnprocessedCandidates({context, clientId, candidates})
          .then((unprocessedCandidates) => {
            console.log(unprocessedCandidates);
            poll.addCandidatesToQueue(context, unprocessedCandidates)
              .then((processedCandidates) => {
                console.log(processedCandidates);
                poll.addCandidatesToTable(processedCandidates)
                  .then((result) => {
                    console.log(result);
                  })
                  .catch((error) => {
                    console.log(error);
                  });
              })
              .catch((error) => {
                console.log(error); 
              })
          })
          .catch((error) => {
             console.log(error); 
          })
      })
      .catch(() => {
        console.done(error); 
      });
    };

2 个答案:

答案 0 :(得分:2)

与提及的@ bugwheels94一样,您可以在print内返回您的承诺,并在之前.then之外添加另一个.then。此外,.then可以带2个参数 - 第二个用于捕获错误。用文字解释有点困难所以这是一个例子。

.then

编辑:@ jfriend00带来了使用所有这些poll.pollForCandidates() .then((candidates) => { let clientId = candidates[0].clientId; return poll.getUnprocessedCandidates({context, clientId, candidates}) .then((unprocessedCandidates) => { console.log(unprocessedCandidates); return poll.addCandidatesToQueue(context, unprocessedCandidates) }, (error) => { console.log(error); }) .then((processedCandidates) => { console.log(processedCandidates); return poll.addCandidatesToTable(processedCandidates) }, (error) => { console.log(error); }) .then((result) => { console.log(result); }), (error) => { console.log(error); }); }) .catch((error) => { console.log(error); }); 方法的好处。以下是链末尾的单个.catch代码的样子。

.catch

编辑2 :删除这些额外的poll.pollForCandidates() .then((candidates) => { let clientId = candidates[0].clientId; return poll.getUnprocessedCandidates({context, clientId, candidates}) .then((unprocessedCandidates) => { console.log(unprocessedCandidates); return poll.addCandidatesToQueue(context, unprocessedCandidates) }) .then((processedCandidates) => { console.log(processedCandidates); return poll.addCandidatesToTable(processedCandidates) }) .then((result) => { console.log(result); }); }) .catch((error) => { console.log(error); }); 语句可让您更清晰。

console.log

答案 1 :(得分:1)

这是更短的方法:

poll.pollForCandidates()
    .then((candidates) => poll.getUnprocessedCandidates({ context, candidates[0].clientId, candidates }))
    .then((unprocessedCandidates) => poll.addCandidatesToQueue(context, unprocessedCandidates))
    .then((processedCandidates) => poll.addCandidatesToTable(processedCandidates))
    .then(console.log)
    .catch(console.error);

说明:

这被称为撰写承诺,它是承诺的伟大超级大国之一。只有在前一个承诺解决后才会调用每个函数,并且可以使用该承诺的输出调用它。

在then函数中你可以做三件事:

  1. 返回另一个承诺
  2. 返回同步值(或未定义)
  3. 抛出同步错误
  4. 在上面的示例中,我们返回一个承诺,因此我们可以使用.then继续撰写承诺

    最后,console.log获得结果并使用它调用console.log。 (与console.error相同)

    那就是它。一旦你理解了这个技巧,你就会理解承诺。

    您可以在此处继续阅读: We have a problem with promises - By: Nolan Lawson