在嵌套承诺链中捕获错误的更简洁方法?

Mic*_* P. 7 javascript promise ecmascript-6

我是使用 promise 的新手,我注意到,为了捕获嵌套 promise 链中的错误,我需要对链中的每个 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); 
      });
    };
Run Code Online (Sandbox Code Playgroud)

Don*_*anM 2

就像 @bugwheels94 提到的那样,您可以从内部返回您的 Promise ,并在前一个 .promise 之外.then添加另一个 Promise 。另外,可以采用 2 个参数 - 第二个参数用于捕获错误。用语言解释有点困难,所以这里有一个例子。.then.then.then

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);
  });
Run Code Online (Sandbox Code Playgroud)

编辑:@jfriend00 提出了有关使用所有这些.catch方法的好消息。.catch以下是链末尾有一个单一的代码的样子。

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);
  });
Run Code Online (Sandbox Code Playgroud)

编辑 2:删除这些额外的console.log语句可以让你变得更干净。

poll.pollForCandidates()
  .then((candidates) => {
    let clientId = candidates[0].clientId;

    return poll.getUnprocessedCandidates({context, clientId, candidates})
      .then(unprocessedCandidates => poll.addCandidatesToQueue(context, unprocessedCandidates))
      .then(poll.addCandidatesToTable)
      .then((result) => {
        console.log(result);
      });
  })
  .catch((error) => {
    console.log(error);
  });
Run Code Online (Sandbox Code Playgroud)