Организация очереди автономных запросов на синхронизацию c с сервером (redux-saga) - PullRequest
1 голос
/ 21 апреля 2020

Я ищу наиболее оптимальный способ решения следующей проблемы и буду очень признателен за помощь. Я создал собственное приложение реагирования, которое использует redux-saga для управления состоянием и redux-persist для хранения автономных данных.

Проблема: в автономном режиме пользователи должны иметь возможность использовать собственное приложение для создания «сообщений» (ради примера), к которому можно прикрепить несколько изображений. Затем, когда у них есть соединение rnet, они должны иметь возможность нажать кнопку синхронизации / загрузки. Эта кнопка меняет state.offlineQueue.offlineQueueShoud с 'cache' на 'sync'

Несколько вещей для рассмотрения; на стороне сервера, у меня есть таблица сообщений и таблица изображений с отношением многие к одному (много изображений к одному сообщению), что означает, что для загрузки изображения на сервер мне нужно передать post_id; Это означает, что я должен был загрузить сообщение, к которому он «прикреплен», на сервер, чтобы я мог передать post_id в запросе. Чтобы решить эту часть, у меня есть функция, которая использует временные uuid для поддержания связи между постами и изображениями:

function* postProcessToOfflineQueueSaga (action) {
  try {
    let post = Object.assign({}, action.payload);
    post.uuid = uuid();
    post.uploaded = false;
    const imagesArr = post.images;
    imagesArr.forEach(image => {
      image.uuid = uuid();
      image.postUuid = post.uuid;
    });
    post.imageIds = imagesArr.map(image => image.uuid);
    delete post.images;

    yield put({ type: POST_ADD_TO_OFFLINE_QUEUE, post });
    yield put({ type: IMAGE_ADD_TO_OFFLINE_QUEUE, imagesArr });

  } catch (error) {
    console.log(error)
  }
}

, которая затем сохраняет его в состоянии приложения в двух массивах; посты и изображения. Например,

state.offlineQueue.offlinePosts: [
  ...
  {
    id: undefined,
    uuid: "4df64ee5-29ba-4347-ae30-ee3d5602eae4",
    imageIds: [
      "62e11ef4-01f7-4052-a3e4-6cd109392818",
      "2c7065ef-fed9-457f-950a-08d4224516dd",
    ],
    uploaded: false,
  }
  ...
]
state.offlineQueue.offlineImages: [
  ...
  {
    id: undefined,
    uuid: "62e11ef4-01f7-4052-a3e4-6cd109392818",
    postId: undefined,
    postUuid: "4df64ee5-29ba-4347-ae30-ee3d5602eae4",
    uploaded: false,
    uri: "/path/to/file/on/device",
  },
  {
    id: undefined,
    uuid: "2c7065ef-fed9-457f-950a-08d4224516dd",
    postId: undefined,
    postUuid: "4df64ee5-29ba-4347-ae30-ee3d5602eae4",
    uploaded: false,
    uri: "/path/to/file/on/device",
  },
  ...
]
state.offlineQueue.offlineQueueShoud: 'cache' // either 'cache' or 'sync'

Итак, как мне go отправить эти данные на сервер? Я думаю следующее:

  1. Проверьте «offlineQueueShoud» (если «кеш» ничего не делает для экономии батареи?)
  2. Если offlineQueueShoud === 'sync', сначала выполните итерацию по отправляет массив сообщений и отправляет каждое сообщение на сервер и использует ответ, чтобы мы могли установить post.id и image.postId для сгенерированного сервером идентификатора.
  3. После загрузки всех сообщений начните загружать изображения одно за другим, как мы теперь у вас есть правильный идентификатор сообщения.
  4. После того, как все сообщения и изображения загружены, очистите список.

Я посмотрел каналы избыточной саги, это лучший способ сделай это? Если да, то как мне сделать так, чтобы, если offlineQueueShoud === 'cache' не разрядил батарею, и если приложение было закрыто / повторно открыто, данные не терялись. Извиняюсь, если я новичок, я только молод :)

PS Я даже делаю это правильно?!

...