В большинстве примеров используется subseToMore в компоненте запроса, но в моем случае данные, возвращаемые запросом и подпиской, очень разные, поэтому я думаю, что мне нужен отдельный компонент подписки.
У меня есть данные временных рядов, которые добавляются в базу данных, вызывая подписку onChangedWeatherIntervals
, которая возвращает сводную информацию о новых данных временных рядов. Если информация о новом временном ряду соответствует фильтрам клиента React, он должен запросить обновленный запрос гистограммы getHistogram
.
Мой тестовый код:
<Query
query={gql`
{
getHistogram (deviceID:"ARMS-NVM-P16", startTimestamp:1525201056) {
columns {
binWidth
binHeight
binCenter
}
}
}
`}
>
{({
loading: queryLoading,
error: queryError,
data: queryData,
refetch
}) => (
<Subscription
subscription={gql`
subscription onChangedWeatherIntervals {
onChangedWeatherIntervals {
changedItems {
deviceID
timestamp
siteKey
}
}
}
`}>
{({
data: subscriptionData,
loading: subscriptionLoading,
error: subscriptionError
}) => {
if (subscriptionData && !subscriptionLoading) {
console.log("subscriptionData: ", subscriptionData);
//TODO: Add code to inspect subscriptionData & determine if we refetch
//refetch() //Uncommenting causes refetch loop after first server push
}
if (queryData && !queryLoading) {
console.log("queryData: ", queryData.getHistogram.columns);
return (<p>{queryData.getHistogram.columns[0].binWidth}</p>);
}
return null
}}
</Subscription>
)
}
</Query>
Поскольку subscriptionLoading
- это true
только до первого нажатия сервера после монтирования, я не уверен, что это лучший способ отличить повторные рендеры от новых subscriptionData. Должен ли я хранить subscriptionData
в state.subscriptionData
и сравнивать два на каждом рендере?
Есть ли более элегантный подход ко всему этому?