【发布时间】:2020-01-15 06:38:56
【问题描述】:
当我尝试通过以下方式使用来自@apollo/react-hooks 包的onSubscription 钩子时,有时会遇到竞争情况。
let { data, loading, error } = useSubscription(MY_SUBSCRIPTION)
if (loading) return 'Loading...';
if (error) return 'Error...';
...
当我加载页面时,大部分时间data 被完美填充,最终加载将变为false,但每~5 次尝试都会出现某种竞争条件,其中loading 永远保持true 和@ 987654328@ 是undefined。
GraphQL 查询:
export const EXERCISE_SUBSCRIPTION = gql`
subscription {
exercises {
id
title
tasks {
id
title
start_time
end_time
}
}
}
`;
软件包版本是(当前)最新的:
@apollo/react-hooks": "^3.1.0-beta.0",不过之前的版本我也试过了。
有没有人经历过类似的事情并知道如何解决?
如果您遇到此问题,我发现了一个解决方法 hack。您可以看到,当我添加回调选项onSubscriptionData 时,数据IS 存在其中,但不知何故并未出现在外部的data 对象中。
// <HACK>
// sometimes data object is empty, but onSubscriptionData is filled.
// in that case use data from onSubscriptionData method.
const [dataFromCb, setDataFromCb ] = useState(null)
let { data, loading } = useSubscription(INJECT_SUBSCRIPTION, {
onSubscriptionData: (res) => {
setDataFromCb(res.subscriptionData.data)
},
});
if (loading && !dataFromCb) return 'Loading...';
data = (data === undefined) ? dataFromCb : data;
// </HACK>
【问题讨论】:
标签: javascript react-hooks apollo race-condition apollo-client