React-Saga - как заставить работать вложенные генераторы - PullRequest
0 голосов
/ 22 сентября 2019

Я обновил старую версию Redx Saga до последней версии, и следующая программа перестала работать.

function* loadAlbumPhoto({ entity }, entityId) {
      try {
        const { accessToken: at } = yield select(state => state.user.info);

        let {
          data: { data: albums }
        } = yield call(API.loadAlbumByEntityId, { entityName: entity, entityId, type: PHOTO });

        if (!albums.length) {
          const options = {
            entityId,
            entityName: entity,
            title:      PHOTO,
            type:       PHOTO
          };
          yield call(API.createAlbum, options);
          ({ data: { data: albums } } = yield call(API.loadAlbumByEntityId, { entityName: entity, entityId, type: PHOTO }));
        }

        const [album] = albums;

        const { data: { data: photos } } = yield call(API.loadPhotosByAlbumId, album.id);
        return yield photos.map(function* (photo) {
          const src = yield getPhotoUrl(photo.uploadData.path, at);

          return {
            src,
            uploadId: photo.uploadId,
            photoId:  photo.id
          };
        });
      } catch (err) {

        console.log(err);

        return [];
      }
    }


function* getPhotoUrl(path, at) {
  try {
    const userPhoto = yield API.userPhoto(path, at);
    return userPhoto;
  } catch (err) {
    /* eslint-disable no-console */
    console.log(err);
    /* eslint-enable no-console */
  }
  return "";
}

Как видите, я пытаюсь вернуть массив из loadAlbumPhoto, но моя проблема в том, что мне нужно вызвать getPhotoUrlфункция, которая также является функцией генератора.

Проблема в том, что результатом loadAlbumPhoto является массив генераторов, а не массив значений.Это произошло с момента моего обновления до последней версии Redx и Sag.

Уже пытался использовать yield*, но не работает, или я не знаю, как его использовать. доходность *

enter image description here

1 Ответ

1 голос
/ 24 сентября 2019

Я бы немного изменил рефакторинг анонимного генератора и затем конвертировал ваш yield в all: https://redux -saga.js.org / docs / api / # alleffects --- parallel-эффекты

function* getPhotoDetails(photo) {
  const src = yield getPhotoUrl(photo.uploadData.path, at);
  return {
    src,
    uploadId: photo.uploadId,
    photoId:  photo.id
  };
}

function* loadAlbumPhoto({ entity }, entityId) {
    // similar up to yield photos.map...
    return yield all(photos.map(photo => call(getPhotoDetails, photo)));
    // similar after
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...