Axios получить и обещать функцию - PullRequest
0 голосов
/ 12 декабря 2018

Я тренируюсь, чтобы сделать аксиоз с обещанием, но без успеха

import axios from "axios";

export class ContiService {
  getConti() {
    return new Promise(function(resolve, reject) {
      setTimeout(function() {
        const URL =
          process.env.REACT_APP_BASE_PATH + process.env.REACT_APP_RESOURCE_CONTI;
        console.log(URL);

        return axios(URL, {
          method: "GET",
          headers: { "content-type": "application/json", preferences: "" },
        });

        resolve(/* ??? */);
      }, 300);
    });
  }
}

export default class Posizionecliente extends Component {
  constructor(props) {
    super(props);

    this.contiService = new ContiService();
    this.state = {
      conti: [],
    };
  }

  componentDidMount() {
    this.contiService.getConti().then(r => this.setState({ conti: r.data.conti }));
  }
}

Как это можно выполнить с обещанием?

Вызов неработа на данный момент, где я должен разместить решение?

Ответы [ 2 ]

0 голосов
/ 12 декабря 2018

Ключ в том, чтобы понять, что axios само по себе возвращает обещание.Таким образом, есть несколько способов приблизиться к этому.

В любом случае нет необходимости в setTimeout.

return new Promise(function(resolve, reject) {
    const URL = process.env.REACT_APP_BASE_PATH+process.env.REACT_APP_RESOURCE_CONTI;
    axios(URL, {
                   method: 'GET',
                   headers: {'content-type': 'application/json', 'preferences' : ''}
               }
    )
    .then(response=> resolve(response.data))
    .catch(err => reject(err))
}

Или, альтернативно, а возможно, и более просто, просто верните сам вызов axios, который вернет обещание и позволит вашей логике компонента обрабатывать состояние соответственно

getConti() {
    const URL = process.env.REACT_APP_BASE_PATH+process.env.REACT_APP_RESOURCE_CONTI;
    return axios(URL, {
                   method: 'GET',
                   headers: {'content-type': 'application/json', 'preferences' : ''}
               }
    )
}

Выне нужно менять логику вашего компонента (за исключением, возможно, обработки отклонений обещаний).

this.contiService.getConti().then(r => this.setState({ conti: r.data.conti }));

.then будет обрабатывать успешное завершение вызова axios.

Вот хорошее прочтение по Promise Chaining.В частности, см. Раздел о возврате обещаний.

0 голосов
/ 12 декабря 2018

Если обещание разрешено с другим обещанием, оно примет новое.Поэтому:

const request = axios(URL, etc);
resolve(request);

Не return.setTimeout ничего не делает с возвращаемым значением функции, которую выполняет.

...