Слушайте действия Reflux вне магазинов

Я пытаюсь понять, как вписать вызовы ajax в поток вещей / рефлюкс. Из клочков информации, которые я нашел в Интернете, кажется правильным отделить логику API от магазинов.

Начав там, я создал клиентский API, который отправляет запросы на сервер. Теперь я хочу, чтобы эти функции слушали мои действия, затем делали запрос и, в случае успеха, вызывали другие действия, которые впоследствии обновляли хранилища новыми данными с сервера.

Как можно получить что-то похожее на метод рефлюкс createStore для моего API? Или есть какой-то другой чистый способ для вызовов моего сервера слушать действия?

2 ответа

Решение

Магазин является связующим звеном между вашими действиями и API. Так же, как ответили в /questions/35902757/v-reflyuks-kak-ya-mogu-poluchit-dannyie-iz-veb-api-aspnet/35902764#35902764

Разница в вашем случае заключается в том, что вы не выполняете ajax-запрос непосредственно в хранилище, а просматриваете свой API-класс, заполняете хранилище данными, возвращенными из вашего API, и запускаете обновление хранилища.

Мой Api - это простой старый объект javascript (POJO), подобный этому. Это в ES6, но вы должны понять:

import request from 'superagent';

// Other helpers functions and setup

let handle = (err) => {
  // error handling stuff
};

export default {
  create(user, cb) {
    return request
      .post(server + '/api/users/new')
      .send(user)
      .on('error', (err) => {
        handle(err);
        cb(err);
      })
      .end(cb);
  },
  login(user, cb) {
    // Post some more stuff
  }
};

Затем я называю это в моем Магазине так:

import Reflux from 'reflux';

import UserActions from '../actions/UserActions';

import Api from '../api/UserApi';

const UserStore = Reflux.createStore({
  listenables: [UserActions],
  getInitialState() {
    // insert stuff
  },
  onCreate(user) {
    Api.create(user, (err, res) => {
      if (err) {
        console.log(err);
      } else {
        // Do something with res
        // this is for JSON, your API might be different
        let user = JSON.parse(res.text);
        this.update(user);
      }
    })
  },
  onLogin(user) {
    // login stuff
  },
  // More methods
  update(user) {
    this.currentUser = user;
    this.trigger(user);
  }
});

Я не обновляю свой магазин и this.trigger() пока вызов API не вернется.

Более разумной идеей может быть оптимистичное обновление:

// inside the todo store
onCreate(todo) {
  Api.create(todo);
  this.update([todos].concat(this.todos));
},
update(todos) {
  this.todos = todos;
  this.trigger(todos);
}

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

Но основная идея заключается в том, что Магазин использует API.

API не является частью потока данных:

Действие-> Магазин-> Компонент-> Действие и т. Д.

Другие вопросы по тегам