Apollo: как отсортировать результаты подписки в UpdateQuery?

Вот рабочий обработчик подписки Apollo:

componentDidMount() {
    const fromID = Meteor.userId();
    const {toID} = this.props;
    this.toID = toID;

    this.props.data.subscribeToMore({
        document: IM_SUBSCRIPTION_QUERY,
        variables: {
            fromID: fromID,
            toID: toID,
        },
        updateQuery: (prev, {subscriptionData}) => {
            if (!subscriptionData.data) {
                return prev;
            }
            const newIM = subscriptionData.data.IMAdded;
            // don't double add the message
            if (isDuplicateIM(newIM, prev.instant_message)) {
                return previousResult;
            }
            return update(prev, {
                instant_message: {
                    $push: [newIM],
                },
            });
        }
    });
}

instant_message массив объектов для отображения Каждый объект содержит поле даты. Мне нужно отсортировать объекты в этом массиве по дате.

Этот подход используется для работы с бета-версиями Apollo:

//update returns a new "immutable" list
const instant_message = update(previousResult, {instant_message: {$push: [newAppt]}});
instant_message.instant_message = instant_message.instant_message.sort(sortIMsByDateHelper);
return instant_message;

Я могу отсортировать массив, но Apollo выдает ошибку с возвращенным объектом - например, он не найден в подпорках, когда render рутина нуждается в этом.

Как правильно вернуть отсортированный массив из updateQuery? Спасибо всем заранее за любую информацию.

1 ответ

Оказывается, это была не та сортировка, которая вызывала аномалию. Похоже, что подписки не удастся, если __TYPENAME возвращаемого объекта здесь не совпадает с чем-то другим - либо varname, используемое в этой подпрограмме ('instant_message' в приведенном выше коде), либо varname массива объектов, возвращаемых в props к функции рендеринга. Выравнивание всех этих вещей так, чтобы они были идентичны, исправляет это.

Другие вопросы по тегам