İçeriğe geç

Anında Arama — Müşteri "kira" Yazdı, Ekranda Neden "k" Sonuçları Var?

Orta 8 dk Sık karşılaşılır

Önce şunu oku: useEffect — Bağımlılıklar ve Temizlik

30 saniyede özet

Her tuşta arama isteği göndermek hem çok istek doğurur hem de cevapları karıştırır: yavaş gelen eski cevap yenisinin üstüne yazılır. Eski cevabı yok saymak ekranı doğru tutar; debounce ise yazma bitene kadar bekleyip tek istek gönderir.

Bir kafede müşteri siparişini her kelimede değiştiriyor: “çay… yok, kahve… yok, latte”. Garson her kelimede mutfağa koşarsa üç içecek gelir. En geç hazırlanan çay en son gelir ve masada o kalır.

  1. Bayt: Hareket aramasında her harfte sunucuya soruyoruz. Anında sonuç, ne güzel!

  2. Sen: Bir müşteri kira yazdı. Ekranda kira ödemeleri değil, k harfiyle başlayan her şey var.

  3. Bayt: k araması en yavaşıymış. En son o geldi ve kira sonuçlarının üstüne yazıldı!

  4. Bayt: Garson gibi: müşteri sözünü bitirsin, eski siparişi de geri çevirelim.

Cevaplar sırayla gelmez

Her tuşa basışta bir istek gönderilirse “kira” kelimesi dört arama yapar: k, ki, kir, kira. Bu istekler farklı sürelerde cevaplanır.

Ekran gelen her cevabı gösterirse, en son gelen kazanır. En son gelen de en yeni arama değil, en yavaş aramadır. Yavaş dönen bir eski cevapArtık güncel olmayan bir isteğe gelen cevap. Yeni aramanın sonucunun üstüne yazılırsa ekran yanlış sonucu gösterir.Sözlükte gör → yenisinin üstüne yazılır.

Kafam karıştı, daha basit anlat

Cevaplar karışık sırayla gelir. Son geleni göstermek, eski aramayı ekranda bırakabilir.

Hızlı kontrolBaşlangıç

Her tuşa basışta arama isteği göndermenin ilk sorunu nedir?

Cevabı biliyor musun?Önce birini seç. Tekrar zamanlaması buna göre ayarlanıyor.

Ağdan gelen cevaplar hangi sırayla gelir?

Cevabı biliyor musun?Önce birini seç. Tekrar zamanlaması buna göre ayarlanıyor.

Bekle, ve eskiyi geri çevir

Ekran yalnızca son yazılan kelimenin cevabını gösteriyor; eski cevaplar yok sayılıyor. Müşteri kira yazdı. Ekranda ne olur ve kaç istek gider? Cevabı göster

Ekranda kira sonuçları olur, ama dört istek gider. Eski cevaplar gelir gelmez yok sayılır; ekran doğru kalır. Yine de her harf sunucuya ayrı bir arama yaptırdı.

Söz bitince sipariş ver; eski siparişi geri çevir.
Adım adım oku
  1. Çay... yok, kahve... yok, latte.
  2. Her kelimede mutfağa koşan garson.
  3. En geç gelen çay masada kaldı.
  4. Söz bitince sipariş ver; eski siparişi geri çevir.

debounceArka arkaya gelen olaylarda, olaylar bir süre durana kadar bekleyip yalnızca sonuncusu için işlem yapmak. Anında aramada istek sayısını azaltır.Sözlükte gör →, yazma bir süre durana kadar bekler ve yalnızca son kelime için tek istek gönderir. Ara istekler hiç gitmez.

İkisi birlikte iyi çalışır. Debounce istek sayısını azaltır; eski cevabı yok saymak ya da eski isteği iptal etmek ise müşteri yeniden yazmaya başladığında ekranı doğru tutar.

Kafam karıştı, daha basit anlat

Debounce az istek gönderir. Eski cevabı yok saymak ekranı doğru tutar.

Hızlı kontrolOrta

Müşteri "kira" yazdı ama ekranda "k" sonuçları görünüyor. En olası neden?

Cevabı biliyor musun?Önce birini seç. Tekrar zamanlaması buna göre ayarlanıyor.

Debounce ne yapar?

Cevabı biliyor musun?Önce birini seç. Tekrar zamanlaması buna göre ayarlanıyor.

Kendin gör

Hareketlerde anında arama: “kira”

Tohum 781237
Ara: …
· sonuç bekleniyor

Zaman: 0/8 · giden istek: 0 (—) · yok sayılan cevap: 0

Hız
Adım 0

Şu an ne oldu?

Müşteri yazıyor

Her harf bir arama mı, yoksa yazma bitince tek arama mı?

Görevler0/3

  • Ekranda eski aramanın sonuçları kalsınaçık

    İpucu

    Her harfte gönder, gelen her cevabı göster.

  • Sonuç doğru olsun ama dört istek gitsinaçık

    İpucu

    Eski cevabı yok say.

  • Tek istekle doğru sonuçaçık

    İpucu

    Yazma durunca gönder.

Olay günlüğü (0)

Henüz olay yok. Oynat veya adımla.

  1. Varsayılanla oynat. Her harfte istek, her cevap gösteriliyor: dört istek gitti ve ekranda k sonuçları kaldı.
  2. “Eski cevabı yok say”ı aç. Ekranda kira sonuçları; ama yine dört istek.
  3. “Yazma durunca gönder”i aç. Tek istek, doğru sonuç; sonuç biraz daha geç geldi.
Hızlı kontrolOrta

Debounce kullanılıyor. Kullanıcı yazmayı bırakıp yeniden yazmaya başlarsa yine eski cevap sorunu olabilir mi?

Cevabı biliyor musun?Önce birini seç. Tekrar zamanlaması buna göre ayarlanıyor.

Eski aramanın cevabını yok saymanın bir yolu nedir?

Cevabı biliyor musun?Önce birini seç. Tekrar zamanlaması buna göre ayarlanıyor.

Tuzaklar

Çok uzun bekleme. Debounce süresi uzarsa, müşteri yazmayı bıraktıktan sonra sonucu uzun süre bekler. Kısa ama yeterli bir süre seç ve beklerken küçük bir yükleniyor işareti göster.

Temizleme fonksiyonunu unutmak. React’te arama useEffect içinde yapılıyorsa, temizleme fonksiyonunda eski isteği iptal et. Etki yenilendiğinde eski istek boşa düşer.

Tek harfle aramak. Tek harflik bir arama çok fazla kayıt döndürür ve en yavaşıdır. En az birkaç harf yazılmadan arama yapma.

Kafam karıştı, daha basit anlat

Beklemeyi kısa tut, eski isteği iptal et, tek harfle arama.

Hızlı kontrolOrta

Debounce süresi çok uzun seçilirse ne olur?

Cevabı biliyor musun?Önce birini seç. Tekrar zamanlaması buna göre ayarlanıyor.
Derinleş · Mobil bankacılık: hareketlerde anında arama 3 dosya · ~64 satır · ilk okumada atlayabilirsin
Proje dosyaları

web/src/search/ useDebounced.ts Hook: yazılan kelime bir süre sabit kalınca aramayı başlatır.

web/src/search/useDebounced.ts
import { useEffect, useState } from 'react';
/** Returns `value` only after it has stayed the same for `delayMs`. */
export function useDebounced<T>(value: T, delayMs: number): T {
const [settled, setSettled] = useState(value);
useEffect(() => {
const timer = setTimeout(() => setSettled(value), delayMs);
return () => clearTimeout(timer); // typing again restarts the wait
}, [value, delayMs]);
return settled;
}

web/src/search/ useTransactionSearch.ts Arama: her yeni kelimede önceki istek AbortController ile iptal edilir; yalnızca güncel arama ekrana yazılır.

web/src/search/useTransactionSearch.ts
import { useEffect, useState } from 'react';
import type { Transaction } from '../api/types';
export function useTransactionSearch(query: string) {
const [results, setResults] = useState<Transaction[]>([]);
const [loading, setLoading] = useState(false);
useEffect(() => {
if (query.length < 2) {
setResults([]);
return;
}
const controller = new AbortController();
setLoading(true);
fetch(`/api/transactions?q=${encodeURIComponent(query)}`, { signal: controller.signal })
.then((response) => response.json())
.then((data: Transaction[]) => {
setResults(data);
setLoading(false);
})
.catch((error: unknown) => {
if ((error as Error).name !== 'AbortError') setLoading(false);
});
// A newer query cancels this request, so its answer never reaches the screen.
return () => controller.abort();
}, [query]);
return { results, loading };
}

web/src/search/ TransactionSearch.tsx Bileşen: en az iki harf, beklerken yükleniyor yazısı, sonucun hangi kelime için olduğu.

web/src/search/TransactionSearch.tsx
import { useState } from 'react';
import { useDebounced } from './useDebounced';
import { useTransactionSearch } from './useTransactionSearch';
export function TransactionSearch() {
const [text, setText] = useState('');
const query = useDebounced(text.trim(), 300);
const { results, loading } = useTransactionSearch(query);
return (
<section>
<label htmlFor="tx-search">Hareketlerde ara</label>
<input id="tx-search" value={text} onChange={(e) => setText(e.target.value)} />
<p role="status">
{loading ? 'Aranıyor…' : query.length >= 2 ? `“${query}” için ${results.length} sonuç` : 'En az iki harf yazın.'}
</p>
<ul>
{results.map((tx) => (
<li key={tx.id}>{tx.description}</li>
))}
</ul>
</section>
);
}

Kendini sına

Şimşek turu1/4

Arka arkaya gönderilen isteklerin cevabı her zaman aynı sırayla gelir.

Soru 1/3İleri

React'te useEffect içinde arama yapılıyor. Eski cevabın ekrana yazılmasını en basit hangi yöntem engeller?

Cevabı biliyor musun?Önce birini seç. Tekrar zamanlaması buna göre ayarlanıyor.

Aklında kalacak üç şey

  1. 1 Ağdan gelen cevaplar gönderildiği sırayla gelmez. Son gelen cevabı göstermek, yavaş gelen eski aramanın yenisini ezmesine yol açar.
  2. 2 Ekrana yazmadan önce cevabın hangi arama için olduğuna bak ya da eski isteği iptal et; ekran ancak böyle doğru kalır.
  3. 3 Debounce, yazma bir süre durana kadar bekleyip tek istek gönderir. Bedeli, sonucun biraz geç gelmesidir.
0/4 kart bu dersten toplandı