axios - как связать вызовы axios в одном обещании - PullRequest
0 голосов
/ 24 января 2019

Я все еще очень плохо знаком с Аксиосом и обещаниями. Я близок к пониманию этого, но я знаю, что делаю некоторые вещи неправильно. У меня есть метод JavaScript, который должен вернуть обещание. Внутри этого метода у меня есть сообщение Axios с двумя .then методами. Если мой первоначальный пост не удался, я получаю эту уродливую ошибку в консоли: Unhandled promise rejection ReferenceError: "reject is not defined". У меня такое чувство, что я не должен вкладывать .catch методы, как я. Я думаю, что это должно быть просто post.then.then.catch.

Кроме того, кто-нибудь может понять, почему я не получаю itemInformation, отправляемую обратно в response во втором .then?

Вот соответствующий код Javascript (сначала вызывается метод addToCartVue):

addToCartVue(itemData) {
  let vm = this;
  return new Promise((resolve, reject) => {

    vm.buildDataString(itemData);

    axios.post(POST_ENDPOINT, {
        data: vm.dataString
      },
      {
        /*headers: {
          "Content-Type": "application/x-www-form-urlencoded"
        }*/
      }).then(response => {
      return vm.updateCartInfo(vm.dataString, itemData.addToCartParameters.itemId, vm.selectedStoreId, vm.quantity);
    }).then(response => {
      if (itemData.addToCartParameters.showLB) {
        vm.emitGlobalEvent('addToCart::open', itemData);
        resolve(response);
      }
    }).catch(error => reject(error));
  }).catch(error => reject(error));
}, // end of addToCartVue method

buildDataString(itemData) {
  // irrelevant code that builds quantity and dataString variables

  vm.quantity = quantity;
  vm.dataString = dataString;
}, // end of buildDataString method

updateCartInfo(dataString, itemId, selectedStore, quantity) {
  axios.get(GET_ENDPOINT, {
    params: {
      data: dataString
    }
  }).then(response => {
    cartDropDown.populateCartDropDown(response);
    const addedItem = response.addedItem;
    const basketInfo = response.basketInfo;

    let productQuantity = quantity;
    if (addedItem.quantity > -1) {
      productQuantity = addedItem.quantity;
    }

    const itemInformation = {
      "itemId": itemId,
      "selectedStore": selectedStore,
      "addedItem": addedItem,
      "basketInfo": basketInfo,
      "displayValues": null,
      "quantity": productQuantity,
      "isCustomProduct": false
    };

    return itemInformation;
  }).catch(err => error => reject(error));
} // end of updateCartInfo method

1 Ответ

0 голосов
/ 24 января 2019

Я думаю, что в проблеме отсутствует ключевое слово return.

Попробуйте добавить возврат в двух местах.

 return axios.post(POST_ENDPOINT...

А также внутри updateCartInfo,

return axios.get(GET_ENDPOINT,...

Кроме того, я не думаю, что вам нужно заключать код в объект Promise, поскольку axios уже возвращает обещание. Это позволит избежать ошибки отклонения ссылки.

let vm = this;
vm.buildDataString(itemData);
return axios.post(POST_ENDPOINT, {
    data: vm.dataString
  },
  {
    /*headers: {
      "Content-Type": "application/x-www-form-urlencoded"
    }*/
  }).then(response => {
  return vm.updateCartInfo(vm.dataString, itemData.addToCartParameters.itemId, vm.selectedStoreId, vm.quantity);
}).then(response => {
  if (itemData.addToCartParameters.showLB) {
    vm.emitGlobalEvent('addToCart::open', itemData);
    return response
  }
})

И лови свои ошибки при звонке на

addVue().then(data => console.log(data).catch(err => console.log(err))
...