После монтирования панели инструментов authProvider завершает выполнение своего обещания - PullRequest
0 голосов
/ 14 октября 2018

Использование [act-admin]

У меня есть customDashboard, который проверяет параметр и перенаправляет на страницу с именем pages:

class DashBoard extends Component {
    componentDidMount() {
    const { push } = this.props;
    if (!localStorage.getItem("activePage")) {
        push("/pages");
    }
    ...

У меня также есть этот authProvider, который выбираетаутентификационные данные из бэкэнда:

export default (type, params) => {
if (type === AUTH_LOGIN) {
    const { authResponse } = params;
    const request = new Request('https://localhost:8080/users/auth', {
        method: 'POST',
        body: JSON.stringify({ userID }),
        headers: new Headers({ 'Content-Type': 'application/json' }),
    });
    fetch(request)
        .then(response => {
            if (response.status < 200 || response.status >= 300) {
                throw new Error(response.body);
             }
             return response.json();
        }).then(({ user }) => {
              localStorage.setItem('token', user.token);
              localStorage.setItem('name', user.name);
              localStorage.setItem('email', user.email);
              localStorage.setItem('activePage', user.activePage);
        }).catch((err) => {
              return Promise.reject(err);
        }).finally(() => {
              return Promise.resolve();});
        ...

Я сократил код, чтобы показать только часть Обещаний.

Однако последняя часть кода, finally, выполняется ПОСЛЕ“/pages” монтируется, как я видел в console.log.И в “/pages” я проверяю activePage, возвращаемую бэкэндом, что происходит слишком поздно.

Чего не хватает в authProvider для «ожидания» выполнения обещаний?

Ответы [ 2 ]

0 голосов
/ 14 октября 2018

Попробуйте использовать async/await, немного проще следить за потоком:

export default async (type, userID) => {
  if (type === AUTH_LOGIN) {
    try  {
      const res =  await fetch('https://localhost:8080/users/auth', {
        method: 'POST',
        body: JSON.stringify({ userID })
        headers: new Headers({ 'Content-Type': 'application/json' }),
      }) // fetch API data

      const { user: { token, name, email, activePage } } = await res.json(); // convert to JSON, from the JSON's user prop, pull out token, name, email, activePage

      localStorage.setItem('token', token);
      localStorage.setItem('name', name);
      localStorage.setItem('email', email);
      localStorage.setItem('activePage', activePage);

    } catch(err) { console.error(err); }
  }
}
0 голосов
/ 14 октября 2018

Копаясь, я нашел этот ответ и сделал некоторые изменения в моем коде.Теперь все работает нормально:

  • Функция по умолчанию async, вызывает функцию auth и возвращает Promise в конце.

    // in src/authProvider.js
    export default async (type, params) => {
        if (type === AUTH_LOGIN) {    
            const { authResponse } = params;
            const user = await auth(userID);
            localStorage.setItem('token', user.token);
            if (user.activePage) localStorage.setItem('activePage', user.activePage);
    
            return Promise.resolve();
    
  • Функция auth возвращает Обещание:

    const auth = async (userID) => {
      const request = new Request('https://localhost:8080/users/auth', {
        method: 'POST',
        body: JSON.stringify({ userID }),
        headers: new Headers({ 'Content-Type': 'application/json' }),
      });
    
      return fetch(request)
        .then(response => {
          if (response.status < 200 || response.status >= 300) {
            throw new Error(response.body);
          }
          return response.json();
        })
        .then(({ user }) => {
          return user;
        });
    }
    
...