Hacktoberfest 2026: le issue che i maintainer hanno segnato per ottobre, aperte e adatte ai principianti. Sfoglia le issue Hacktoberfest

Errors don't propagate to new on-demand live queries after an earlier request succeeds

Chiusa
#1,764 0 commenti 0 reazioni 0 assegnatari Vedi su GitHub

I maintainer di solito rispondono entro 1 giorno

Nessuno ha ancora preso questa issue.

Valutazione

Difficoltà
3/5
Tempo stimato
1-2 giorni
Idoneità per principianti
68/100
Tipo di issue
Bug
Chiarezza
Abbastanza chiara
Stato di attività
Attiva
Stack tecnologico
typescript
Ambito
data

Direzione di ricerca

Inizia con il comportamento on-demand esposto tramite queryCollectionOptions e createLiveQueryCollection, usando la riproduzione e gli stati attesi rispetto a quelli effettivi riportati in questa issue. Verifica in che modo una richiesta filtrata successiva influisce sullo stato di errore della live query, quindi conferma che la query che fallisce segnali un errore mentre la query riuscita rimane pronta.

Scritto dal modello di indicizzazione a partire dal testo della issue.

Descrizione

  • [x ] I've validated the bug against the latest version of DB packages

Describe the bug
The initial error-propagation issue in #1260 (https://github.com/TanStack/db/issues/1260) was recently resolved. While testing that fix with syncMode: 'on-demand', I found a further problem with that implementation.
After one filtered request succeeds, subsequent live queries that request different subsets do not enter the error state when their requests fail. This is a common use case for on-demand collections—for example, fetching different date ranges or ID ranges.

I would expect an error from a later filtered request to propagate to that specific live query, while existing live queries with usable data remain ready.

Tested with

  • @tanstack/db: 0.8.3
  • @tanstack/query-core: 5.102.2
  • @tanstack/query-db-collection: 1.2.8

To Reproduce

  import { QueryClient } from '@tanstack/query-core';
  import { createCollection, createLiveQueryCollection, eq, parseLoadSubsetOptions } from '@tanstack/db';
  import { queryCollectionOptions } from '@tanstack/query-db-collection';

  const successfulTodoId = 'successful';
  const failingTodoId = 'failing';
  const requestedTodoIds = [];

  let resolveSuccessfulTodoRequest;
  const successfulTodoRequestFinished = new Promise((resolve) => {
      resolveSuccessfulTodoRequest = resolve;
  });

  const queryClient = new QueryClient({
      defaultOptions: {
          queries: {
              retry: false,
          },
      },
  });

  const todoCollection = createCollection(
      queryCollectionOptions({
          queryKey: ['todos'],
          queryClient,
          retry: false,
          syncMode: 'on-demand',
          queryFn: async (context) => {
              const requestedTodoId = parseLoadSubsetOptions(context.meta?.loadSubsetOptions).filters.find(
                  ({ operator }) => operator === 'eq',
              )?.value;

              requestedTodoIds.push(String(requestedTodoId));

              if (requestedTodoId === successfulTodoId) {
                  const result = [{ id: successfulTodoId, completed: false, text: 'Successful todo' }];

                  resolveSuccessfulTodoRequest();

                  return result;
              }

              if (requestedTodoId === failingTodoId) {
                  throw new Error('Failed to fetch filtered todos');
              }

              return [];
          },
          getKey: (todo) => todo.id,
      }),
  );

  const successfulTodoQuery = createLiveQueryCollection({
      query: (q) => q.from({ todo: todoCollection }).where(({ todo }) => eq(todo.id, successfulTodoId)),
      startSync: true,
  });

  // Wait until the first live query and its backend request have completed.
  await successfulTodoQuery.preload();
  await successfulTodoRequestFinished;

  if (JSON.stringify(requestedTodoIds) !== JSON.stringify([successfulTodoId])) {
      throw new Error(`The successful query did not finish before the failing query started:
      ${JSON.stringify(requestedTodoIds)}`);
  }

  const failingTodoQuery = createLiveQueryCollection({
      query: (q) => q.from({ todo: todoCollection }).where(({ todo }) => eq(todo.id, failingTodoId)),
      startSync: true,
  });

  await failingTodoQuery.preload().catch(() => undefined);

  console.log({
      requestedTodoIds,
      todoCollectionReady: todoCollection.isReady(),
      todoCollectionHasError: todoCollection.utils.isError,
      todoCollectionLastError: todoCollection.utils.lastError?.message,
      successfulTodoQueryStatus: successfulTodoQuery.status,
      failingTodoQueryStatus: failingTodoQuery.status,
  });

 

Expected behavior
Expected output:

{
      requestedTodoIds: ['successful', 'failing'],
      todoCollectionReady: true,
      todoCollectionHasError: true,
      todoCollectionLastError: 'Failed to fetch filtered todos',
      successfulTodoQueryStatus: 'ready',
      failingTodoQueryStatus: 'error',
  }

Actual output:

  {
      requestedTodoIds: ['successful', 'failing'],
      todoCollectionReady: true,
      todoCollectionHasError: true,
      todoCollectionLastError: 'Failed to fetch filtered todos',
      successfulTodoQueryStatus: 'ready',
      failingTodoQueryStatus: 'ready',
  }
Lingua principale
TypeScript
Stelle
3.9k
Fork
272
Merge medio
1g 45m
PR unite (30g)
208

Preparare l'ambiente

Come iniziare

  1. Leggi tutta la issue e poi la guida ai contributi del progetto.
  2. Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
  3. Fai un fork del repository e lavora su un branch.
  4. Apri una pull request che faccia riferimento al numero della issue.

Altre issue di TanStack/db

Tutte le issue di TanStack/db

Issue simili

Altre issue su TypeScript

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.