Контекст
У меня есть приложение 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",
},
{
// ...
},
...
]