JavaScript үндэс / Callback функц

Callback функц

JavaScript-д функцийг хувьсагч шиг ашиглаж болно — өөр функцид аргумент болгон дамжуулж болно. Ийнхүү дамжуулагдсан функцийг callback гэнэ. "Дараа нь дуудаарай" гэсэн утгатай — нэг ажил дууссаны дараа callback ажиллана.

Callback гэж юу вэ?

Эхлээд энгийн жишээг харцгаая. Функцийг аргумент болгон дамжуулж болно:

javascript
function мэндлэх(нэр) {
  console.log("Сайн уу, " + нэр + "!");
}

function боловсруулах(callback) {
  callback("Болд");
}

боловсруулах(мэндлэх); // Сайн уу, Болд!

мэндлэх функцийг боловсруулах-д дамжуулав — дуудах хаалт () тавиагүйг анзаарна уу. () тавьсан бол шууд дуудна, тавиагүй бол функцийн өөрийг нь дамжуулна.

Дараалсан үйлдэл

Callback-ийн хамгийн энгийн хэрэглээ бол нэг үйлдэл дууссаны дараа нөгөөг ажиллуулах явдал юм.

javascript
function татах(файл, дуусвал) {
  console.log(файл + " татаж байна...");
  // татах дуусав гэж төсөөлье
  дуусвал("Амжилттай татлаа!");
}

function хариу(мэдэгдэл) {
  console.log(мэдэгдэл);
}

татах("зураг.png", хариу);
// зураг.png татаж байна...
// Амжилттай татлаа!

Anonymous callback

Callback-ийг тусад нь нэрлэлгүй, шууд дотор нь бичиж болно. Энэ нь маш түгээмэл хэлбэр юм.

javascript
function татах(файл, дуусвал) {
  console.log(файл + " татаж байна...");
  дуусвал("Амжилттай!");
}

татах("дуу.mp3", function (мэдэгдэл) {
  console.log(мэдэгдэл);
});

Arrow функц ашиглавал улам товч болно:

javascript
татах("дуу.mp3", (мэдэгдэл) => {
  console.log(мэдэгдэл);
});

Массивын callback методууд

forEach, map, filter зэрэг массивын методууд callback авдаг — та өмнөх хичээлүүдэд эдгээрийг аль хэдийн ашигласан:

javascript
const тоонууд = [1, 2, 3, 4, 5];

тоонууд.forEach((тоо) => {
  console.log(тоо * 2);
});
// 2, 4, 6, 8, 10

forEach-д дамжуулсан (тоо) => { ... } бол callback — массивын элемент бүрд ажиллана.

setTimeout ба callback

setTimeout нь тодорхой хугацааны дараа callback ажиллуулдаг. Цаг хугацаатай холбоотой callback-ийн сонгодог жишээ:

javascript
console.log("Эхлэв");

setTimeout(() => {
  console.log("2 секундын дараа энэ гарна");
}, 2000);

console.log("Энэ шууд гарна");

// Эхлэв
// Энэ шууд гарна
// 2 секундын дараа энэ гарна

JavaScript зогсохгүйгээр дараагийн мөрийг ажиллуулдгийг анзаарна уу — setTimeout дуусахыг хүлээхгүй. Үүнийг asynchronous (async) зан гэнэ.

Callback hell

Callback дотор callback, дотор нь дахин callback бичих үед код баруун тийш эвхэгдэж, уншихад хэцүү болдог. Үүнийг callback hell гэнэ:

javascript
татах("файл1", () => {
  боловсруулах("файл1", () => {
    хадгалах("файл1", () => {
      console.log("Бүгд дууслаа");
      // Улам гүн болсоор...
    });
  });
});

Энэ асуудлыг шийдэхийн тулд Promise гарч ирсэн. Дараагийн хичээлд яг үүнийг үзнэ.

Дараагийн хичээлд:

Promise — callback hell-ийн оронд цэвэр, уншигдахад хялбар async код бичих арга. Орчин үеийн JavaScript-ийн суурь ойлголтуудын нэг юм.