Ошибка: [mobx-state-tree] Не удалось разрешить ссылку XXX для типа «Пользователь» - PullRequest
0 голосов
/ 25 ноября 2018

Контекст

У меня есть приложение React, которое поддерживается mobx-state-tree (MST).На одной из страниц выполняется два параллельных вызова API для извлечения списка Projects и списка систем Users.

Ответы этих двух API-интерфейсов затем применяются в качестве снимка кдва узла в одном дереве.Поле владельца модели проекта относится к модели пользователя.

Моя проблема в том, что вызов API проекта GET часто завершается раньше, чем вызов API пользователя GET.Классическое «гоночное состояние».Итак, когда MST пытается разыменовать значение владельца, пользователь с таким идентификатором недоступен в дереве, и я получаю ошибку времени выполнения, подобную этой:

Ошибка: [mobx-state-дерево] Не удалось разрешить ссылку 'dtGNbVdNOQIAX0OMGaH2r2oSEf2cMSk9AJzPAf4n7kA' для типа 'Пользователь' (из узла: / projectListStore / projects / 0 / владельца)

Вопрос

Как сделатьвокруг ошибки?

Обратите внимание, что выполнение вызовов API зависит друг от друга (await или users.load().then(users => { projects.load(); }) - не вариант для нашего проекта.

MST Models

export const ProjectModel = types
  .model('Project', {
    projectId: types.optional(types.identifierNumber, 0),
    title: '',
    descriptionStatus: '',
    projectStatus: '',
    startDate: CustomDate,
    endDate: CustomDate,
    owner: types.maybeNull(types.reference(User)), // -----
  })                                                        \ 
  // ...                                                     |
                                                             |
export const User = types                                    |
  .model('User', {                                          /
    userId: types.identifier,                      // <<<--
    userName: '',
    firstName: '',
    lastName: '',
    email: '',
    lastVisited: CustomDate,
  })
  // ...

Пример API

GET https://service.com/api/users

[
  {
    "userId": "g-gqpB1EbTi9XGZOf3IkBpxSjpAHM8fpkeL4YZslEL8",
    "userName": "john.doe@service.com",
    "firstName": "John",
    "lastName": "Doe",
    "email": "john.doe@service.com",
    "lastVisited": "2018-01-18T17:32:48.947"
  },
  {
    ...
  },
  ...
]

GET https://service.com/api/workmanagement/projects?minStartDate=&maxStartDate=2018-11-24&status=Active

[
  {
    "projectId": 1,
    "title": "Project Title",
    "description": "Praesent luctus vitae nunc sed condimentum. Duis maximus arcu tortor, vitae placerat enim ultrices sed. Etiam scelerisque gravida justo, vitae venenatis dui pellentesque eu.",
    "projectStatus": "active",
    "startDate": "2018-08-20T00:00:00",
    "endDate": "2019-07-01T00:00:00",
    "owner": "g-gqpB1EbTi9XGZOf3IkBpxSjpAHM8fpkeL4YZslEL8",
  },
  {
    // ...
  },
  ...
]

1 Ответ

0 голосов
/ 16 марта 2019

Похоже, вы потенциально загружаете пользовательские данные после создания модели проекта. Это может быть так же просто, как использование поздней ссылки.Это, как кажется, для любых типов, которые могут быть созданы после создания этой модели.

вместо этого owner: types.maybeNull(types.reference(User))

попробуйте это owner: types.maybeNull(types.late(() => types.reference(User)))

...