Ana içeriğe geç

Yan yana

CallbackvsPromise

Callback ile promise arasındaki fark nedir?

Güncellendi 2 dk okuma6 fark

Kısaca

Callback, iş bitince çağrılsın diye başka bir fonksiyona verilen fonksiyondur; promise ise gelecekteki bir sonucu temsil eder, zincirlenir ve hataları yakalar.

Callback

Geri çağırma fonksiyonu

Callback, başka bir fonksiyona argüman olarak verilen ve o fonksiyonun bir iş bittiğinde ya da bir olay gerçekleştiğinde sonradan çağırdığı fonksiyondur.

Callback sayfasını oku

Promise

Söz

Promise, asenkron bir işlemin nihai sonucunu temsil eden bir nesnedir; iş bittiğinde kodun başarıya ya da hataya tepki vermesini sağlar.

Promise sayfasını oku

Callback ve Promise karşılaştırması

ÖzellikCallbackPromise
NedirVerilen ve sonra çağrılan bir fonksiyonGelecekteki bir değeri temsil eden bir nesne
Sıralı adımlarİç içe yazılır.then() ile zincirlenir ya da await ile yazılır
HatalarHer callback'te ayrı denetlenirBütün zincir için tek bir .catch() ya da try/catch
Kaç kez çalışırÇağıran ne kadar isterseTam olarak bir kez sonuçlanır
Paralel işlerBiten işleri elle saymakPromise.all, Promise.race ve benzeri yardımcılar
Tipik kullanımOlaylar, zamanlayıcılar, dizi metotları, eski Node.js API'leriAğ istekleri, dosya okumaları ve diğer tek seferlik sonuçlar

Fark, açıklamalı

İkisi de bir dosyayı okumak ya da bir API'yi çağırmak gibi sonradan biten işlerle başa çıkmanın yollarıdır. Callback'te işleme bir fonksiyon verirsiniz, işlem de bittiğinde onu sonuçla çağırır; Node.js'te bu çoğu zaman (error, result) biçimindedir. Promise'te ise işlem size bir şey geri verir: önce beklemede (pending) olan, sonra bir değerle yerine getirilen (fulfilled) ya da bir hatayla reddedilen (rejected) bir nesne.

Fark, adımlar birbirine bağlı olduğunda ortaya çıkar. Callback'lerde her adım bir öncekinin callback'inin içine yazılır; kod sağa doğru kayar ve hatalar her seviyede ayrı ayrı denetlenmek zorunda kalır. Buna callback cehennemi (callback hell) denir. Promise'ler bunu .then() çağrılarından oluşan düz bir zincire çevirir, her hatayı tek bir .catch()'e yollar ve işleri paralel çalıştırmak için Promise.all gibi yardımcılarla birleşir.

Promise'ler callback fikrinin yerini almaz, onun üzerine kurulur: .then() yine bir fonksiyon alır. Getirdikleri şey güvencelerdir. Bir promise yalnızca bir kez sonuçlanır ve işleyicileri her zaman asenkron çalışır; bu da bir callback'in iki kez ya da erken çağrılması gibi hataları önler. Bugün en yaygın yazım biçimi olan async ve await, promise'lerin üzerine kurulu bir sözdizimidir.

Sık yapılan bir yanlış, callback'lerin modası geçti sanılmasıdır. Olay dinleyicileri, map gibi dizi metotları ve birçok API haklı olarak callback kullanır; çünkü bunlar defalarca ya da hemen çalışır. Promise'ler tek seferlik asenkron sonuçlara uyar; eski callback tarzı API'ler de örneğin Node.js'in util.promisify aracıyla sarılabilir.

Hangisini kullanmalısınız?

Callback şu durumlarda doğru seçim:

  • Fonksiyon, olay dinleyicilerinde ya da dizi metotlarında olduğu gibi defalarca çalışıyor.
  • Yalnızca callback sunan eski bir API ile çalışıyorsunuz.
  • İş senkron ve yalnızca bir adımı özelleştirmeniz gerekiyor.

Promise şu durumlarda doğru seçim:

  • Bir ağ isteği gibi tek bir sonucu bekliyorsunuz.
  • Birbirine bağlı birkaç asenkron adım var.
  • Hataları tek bir yerde yakalamak ya da işleri paralel çalıştırmak istiyorsunuz.

Bir dosyayı okuyup ayrıştırmak

Callbackjavascript
import fs from "node:fs";

fs.readFile("config.json", "utf8", (err, text) => {
  if (err) return console.error(err);
  try {
    const config = JSON.parse(text);
    console.log(config.port);
  } catch (parseError) {
    console.error(parseError);
  }
});
Promisejavascript
import { readFile } from "node:fs/promises";

readFile("config.json", "utf8")
  .then((text) => JSON.parse(text))
  .then((config) => console.log(config.port))
  .catch((err) => console.error(err)); // one place for every error

Sık sorulan sorular

async/await, promise'lerle aynı şey mi?

Arka planda evet. Bir async fonksiyon her zaman bir promise döndürür; await de o fonksiyonu bir promise sonuçlanana kadar bekletir. Yani promise zincirlerini daha okunaklı yazmanın bir yoludur.

Callback cehennemi nedir?

Her asenkron adımın bir öncekinin callback'i içine yazıldığı koddur; girintisi derinleşir, takip etmesi zorlaşır ve aynı hata denetimleri her seviyede tekrarlanır.

Callback tabanlı bir API'yi promise'e çevirebilir miyim?

Evet. Onu new Promise((resolve, reject) => …) ile sarabilir ya da Node.js'te (error, result) callback'i alan fonksiyonlar için util.promisify kullanabilirsiniz.

Daha fazla

Ayarlar