首页 > 解决方案 > 使用 Axios 在两个地方敲出错误消息

问题描述

我们在 api.js 文件中包含所有 api 调用,如下所示:

import { axiosClient as axios } from 'Utils';

export const urls = {
  getReceiptData: '/purchase/getReceiptData',
  processPurchase: '/purchase/process-purchase',

};

export const getReceiptData = () => axios.get(urls.getReceiptData)
  .then(({ data }) => data);

export const purchaseStatus = purchaseId => axios.get(urls.purchaseStatus.replace('$1', purchaseId))
  .then(({ data }) => data);

但是,我们希望开始将所有错误消息记录到 New Relic,同时当然不会破坏功能。

我最初的反应是在这个文件中收到错误消息并在此处处理它,如下所示:

export const purchaseStatus = purchaseId => axios.get(urls.purchaseStatus.replace('$1', purchaseId))
  .then(({ data }) => data, error => newrelic.noticeError(error););

但是从循环调用 api.js 文件时,我无法获得相同的功能:

  pollPurchase = purchaseId => new Promise(resolve => setTimeout(resolve, 1000))
    .then(() => api.purchaseStatus(purchaseId))
    .then((response) => {
      if (response.state === 'COMPLETED') {
        return true;
      }
      return this.pollPurchase(purchaseId);
    });

它似乎打破了循环。有人对如何做到这一点有建议吗?

标签: javascriptpromiseaxios

解决方案


Axios 使用承诺模式而不是回调模式,因此尝试使用这个

export const purchaseStatus = purchaseId => 
  axios.get(urls.purchaseStatus.replace('$1', purchaseId))
  .then(({ data }) => data)
  .catch(error => { 
    newrelic.noticeError(error);
    return Promise.reject(error);
 });

它应该像在您的解决方案中尝试传递 .then 2 个回调一样工作,但它只接受第一个回调并忽略第二个回调。

并将 pollPurchase 方法更新为

pollPurchase = purchaseId => new Promise(resolve => setTimeout(resolve, 1000))
 .then(() => api.purchaseStatus(purchaseId))
 .then((response) => {
   if (response.state === 'COMPLETED') {
     return true;
   }
   return this.pollPurchase(purchaseId);
 }).catch(console.error)

推荐阅读