Как вернуть данные изнутри обещания. Все - PullRequest
0 голосов
/ 06 сентября 2018
findCustomerOrders(customerId) {
    return APIService.getCustomerOrders(this, customerId)
      .then((data) =>  {
        data.map(order => {
          return Promise.all([APIService.getShippingAddress(this, order.id), APIService.getProducts(this,order.id), APIService.getCustomerById(this, customerId)])
          .then((returnedData)=>{
            return buildOrder(returnedData);
          });
      });
   });
  }

Функция возврата данных:

findCustomerOrders(1)
.then((final) =>{console.log(final)});

Я должен вернуть данные, которые возвращаются функцией buildOrder. Из-за Promise.all () я не могу получить данные обратно, и они показывают возвращенное значение как неопределенное. Функция buildOrder корректно возвращает значение, но проблема в вышеприведенном блоке, который также только в операторах возврата Пожалуйста, помогите мне.

Ответы [ 4 ]

0 голосов
/ 07 сентября 2018

Я получил решение для этого от своего наставника:

findCustomerOrders(customerId) {
    return APIService.getCustomerOrders(this, customerId)
      .then(orders => orders.map(order => Promise.all([APIService.getShippingAddress(this, order.id), APIService.getProducts(this, order.id), APIService.getCustomerById(this, customerId)])
        .then((returnedData) => {
          return buildOrder(order);
        })))
      .then(promises => Promise.all(promises));
  }
0 голосов
/ 06 сентября 2018

если под возвратом вы имеете в виду использовать данные, возвращенные buildOrder после вызова findCustomerOrders, вы можете просто .then это сделать. Просто убедитесь, что функция возвращает Обещание.

findCustomerOrders(1).then((data) => {
   // data should be what buildOrder resolve to.
})

data.map возвращает массив Promises, каждый из которых будет преобразован в результат buildOrder. Таким образом, вы также должны вернуть обещание:

findCustomerOrders(customerId) {
    return APIService.getCustomerOrders(this, customerId)
      .then((data) =>  {
        return Promise.all(data.map(order => {
          return Promise.all([APIService.getShippingAddress(this, order.id), APIService.getProducts(this,order.id), APIService.getCustomerById(this, customerId)])
          .then((returnedData)=>{
            return buildOrder(returnedData);
          });
      }));
   });
  }
0 голосов
/ 06 сентября 2018

если вы используете promise.all, тогда функция выводит несколько значений, поэтому вы должны записать все выходные переменные в массив.

findCustomerOrders(customerId) {
return APIService.getCustomerOrders(this, customerId)
  .then((data) =>  {
    data.map(order => {
      return Promise.all([APIService.getShippingAddress(this, order.id), APIService.getProducts(this,order.id), APIService.getCustomerById(this, customerId)])
      .then(([result1, result2, result3])=>{
        return buildOrder([result1, result2, result3]);
      });
  });
   });
  }

это может работать, оно не даст вашему значению быть неопределенным, если значение не определено.

0 голосов
/ 06 сентября 2018

Не возвращайте Promise.all(). Вместо этого просто вызовите .then() в конце, например:

findCustomerOrders(customerId) {
return APIService.getCustomerOrders(this, customerId)
  .then((data) =>  {
    data.map(order => {
      Promise.all([APIService.getShippingAddress(this, order.id), APIService.getProducts(this,order.id), APIService.getCustomerById(this, customerId)]).then((returnedData) => {
        return buildOrder(returnedData);
      })
   });
 });
}

Кроме того, buildOrder(returnedData) передается куда-то еще? Потому что, если это не так, просто позвоните прямо, а не возвращайте.

...