Мы видели много разных объяснений обратного вызова в JavaScript, но на этот раз мы узнаем больше на примерах, а не на определениях. Я собрал много разных примеров для обучения, и вы можете практиковать их, чтобы обрести уверенность.

Мы рассмотрим список концепций, упомянутых ниже.

  • Перезвонить
  • Ад обратного вызова
  • Обещать
  • Цепочка обещаний
  • Асинхронный — ожидайте

обратный вызов, обещание и асинхронное ожидание — это способ асинхронного выполнения javascript.

Обратный вызов — это функция, которая передается как аргумент другой функции.

Обещать-

Это объект, представляющий завершение или сбой асинхронной задачи. Он используется, чтобы избежать ада обратных вызовов и делает наш код более читабельным. Он имеет три состояния: ожидание, разрешение и отклонение.

Асинхронное ожидание-

Это снова способ обработки асинхронной операции в JavaScript. Это современный синтаксис обработки асинхронных задач. Это расширение обещаний, которое упрощает чтение и запись нашего кода. Ключевое слово async используется перед объявлением функции, где нам нужно выполнить асинхронную задачу и вернуть обещание. Ключевое слово Await используется внутри функции async, где нам нужно приостановить выполнение до тех пор, пока обещание не будет выполнено.

Пример 1: (обратный вызов)

function getUser(callback){
const user= {id: 123, name: "john"};
callback(user);
}
getUser(function(user){
console.log(user);
})

// output: {id: 123, name: "john"}




// example

function calc(a,b,method){
  return method(a,b);
}

function add(a,b){
  return a+b;
}

function subs(a,b){
  return a-b;
}

console.log(calc(2,3,add))
console.log(calc(4,3,subs))

// 5
// 1

Пример 2: (обратный вызов)

//we have list of users:
const usersDatabase = [
  { id: 123, name: "Bittu" },
  { id: 456, name: "Ravi" },
  { id: 789, name: "vivek" },
];

// get user details
// input=> id:4 -> output (id: 4,name:"bittu")  -- complete object

function getUser(userId, callback){
  let user;
  usersDatabase.forEach((data)=>{
    if(data.id===userId){
      user= data;
    }
  })

  if(user){
  callback(user);
  }
  else{
    callback(null)
  }
}

getUser(123,function(user){
  if(user){
  console.log(user);
  }
  else{
    console.log("user not found")
  }
})

//output: {id: 123, name: "Bittu"} 
// try passing some different id which is not present in array of object in getUser method



//other  example
function getUser(id, cb){
    setTimeout(() => {
        console.log("reading data");
        const user= {id, name: `User ${id}`};
        console.log('before callback function called')
        cb(user);
        console.log('after callback function called')
    }, 2000);
}

getUser(1, function user(user){
    console.log(user)
});

Пример 3: (ад обратных вызовов)

const usersDatabase = [
  { userId: 123, name: "Bittu" },
  { userId: 456, name: "Ravi" },
  { userId: 789, name: "Vivek" },
];

const orderDetailsDatabase = [
  { orderId: 101, userId: 123, items: ['burger', 'fries', 'coke'] },
  { orderId: 102, userId: 456, items: ['burger', 'fries', 'coke'] },
  { orderId: 103, userId: 789, items: ['burger', 'fries', 'coke'] },
];

const orderStatusDatabase = [
  { orderId: 101, cookedStatus: 'ready' },
  { orderId: 102, cookedStatus: 'notReady' },
  { orderId: 103, cookedStatus: 'ready' },
];


// input: id --> getUserDetails  --> output: userId, name
// input: userId --> getOrderDetails --> output: orderId,items
// input: orderId --> getOrderStatus --> output: cookedStatus




function getUserDetails(id, callback) {
  let user;
  console.log("input id: ", id)
  usersDatabase.forEach((data) => {
    if (data.userId === id) {
      user = data;
    }
  })
  console.log("user", user)
  callback(user);
}

function getOrderDetails(orderId, callback) {
  let orderDetails;
  orderDetailsDatabase.forEach((data) => {
    if (data.userId === orderId) {
      orderDetails = data;
    }
  })
  console.log("order", orderDetails)
  callback(orderDetails)
}

function getOrderStatus(orderId) {
  let orderStatusDetails;
  orderStatusDatabase.forEach((data) => {
    if (data.orderId === orderId) {
      orderStatusDetails = data;
    }
  })
  console.log("Order Status", orderStatusDetails)
}




getUserDetails(123, function (user) {
  getOrderDetails(user.userId, function (orders) {
    getOrderStatus(orders.orderId)
  })
})

// output-- 
// input id: 123
// user: {userId: 123, name: "Bittu"}
// order: {orderId: 101, userId: 123, items:["burger", "fries", "coke"]}
// Order Status: {orderId: 101, cookedStatus: "ready"}

Пример 4: (обратный вызов с функцией setTimeout)

const usersDatabase = [
  { userId: 123, name: "Bittu" },
  { userId: 456, name: "Ravi" },
  { userId: 789, name: "Vivek" },
];


function getUserDetails(id, callback) {
  setTimeout(function () {
    let user;
    usersDatabase.forEach((data) => {
      if (data.userId === id) {
        user = data;
      }
    })
    callback(user)
  }, 3000)
}


getUserDetails(123, function (user) {
  console.log("user id: ", user)
})

// user id : {userId: 123, name: "Bittu"}

Пример 5: (ад обратный вызов с функцией setTimeout)

//we have list of users:
const usersDatabase = [
  { userId: 123, name: "Bittu" },
  { userId: 456, name: "Ravi" },
  { userId: 789, name: "Vivek" },
];

const orderDetailsDatabase = [
  { orderId: 101, userId: 123, items: ['burger', 'fries', 'coke'] },
  { orderId: 102, userId: 456, items: ['burger', 'fries', 'coke'] },
  { orderId: 103, userId: 789, items: ['burger', 'fries', 'coke'] },
];

const orderStatusDatabase = [
  { orderId: 101, cookedStatus: 'ready' },
  { orderId: 102, cookedStatus: 'notReady' },
  { orderId: 103, cookedStatus: 'ready' },
];


// input: id --> getUserDetails  --> output: userId, name
// input: userId --> getOrderDetails --> output: orderId,items
// input: orderId --> getOrderStatus --> output: cookedStatus




function getUserDetails(id, callback) {
  setTimeout(function () {
    let user;
    console.log("input id: ", id)
    usersDatabase.forEach((data) => {
      if (data.userId === id) {
        user = data;
      }
    })
    console.log("user", user)
    callback(user);
  }, 2000)
}

function getOrderDetails(orderId, callback) {

  setTimeout(function () {
    let orderDetails;
    orderDetailsDatabase.forEach((data) => {
      if (data.userId === orderId) {
        orderDetails = data;
      }
    })
    console.log("order", orderDetails)
    callback(orderDetails)
  }, 5000)
}

function getOrderStatus(orderId) {
  setTimeout(function () {
    let orderStatusDetails;
    orderStatusDatabase.forEach((data) => {
      if (data.orderId === orderId) {
        orderStatusDetails = data;
      }
    })
    console.log("Order Status", orderStatusDetails)
  }, 3000)
}


getUserDetails(123, function (user) {
  getOrderDetails(user.userId, function (orders) {
    getOrderStatus(orders.orderId)
  })
})

// output-
// input id: 123
// user: {userId: 123, name: "Bittu"}
// order: {orderId: 101, userId: 123, items:["burger", "fries", "coke"]}
// Order Status: {orderId: 101, cookedStatus: "ready"}

Пример 6: (асинхронный JS для практики)

// *******
console.log("first");

setTimeout(function(){
  console.log("second");
});

console.log("third")


// first 
// third
// second


// now we want to print first,second,third in this order
// doesn't matter how much time this setTimeout takes


console.log("first");

function test(callback){
  setTimeout(function () {
    console.log("second");
    callback()
  }, 1000);

}

test(function(){
    console.log("third")
})


Пример 7: (Простое обещание)

const myPromise = new Promise((resolve, reject) => {
    const randomNum = Math.round(Math.random() * 10);
    if (randomNum < 5) {
      resolve(`Success! Random number: ${randomNum}`);
    }
    else {
      reject(`Error! Random number: ${randomNum}`);
    }       
});

myPromise
  .then((result) => {
    console.log(result);
  })
  .catch((error) => {
    console.error(error);
  });

Пример 8: (Обещание с setTimeout)

const myPromise = new Promise((resolve, reject) => {
  setTimeout(() => {
    const randomNum = Math.round(Math.random() * 10);
    if (randomNum < 5) {
      resolve(`Success! Random number: ${randomNum}`);
    }
    else {
      reject(`Error! Random number: ${randomNum}`);
    }
  }, 1000);
});

myPromise
  .then((result) => {
    console.log(result);
  })
  .catch((error) => {
    console.error(error);
  });

Пример 9: (Обещание — Fetch API)

function fetchData(url) {
  return fetch(url);
}

const apiUrl = 'https://jsonplaceholder.typicode.com/posts/1';

fetchData(apiUrl)
  .then(response => {
    return response.json(); 
  })
  .then(data => {
    console.log('Data received:', data);
  })
  .catch(error => {
    console.log('Error:', error);
  });

Пример 10: (асинхронный — ожидание)

const apiUrl = 'https://jsonplaceholder.typicode.com/posts/1';


async function fetchData11(url) {
  try {
    const response = await fetch(url);
    const data = await response.json();
    console.log('Data received:', data);
  } catch (error) {
    console.log('Error:', error);
  }
}

fetchData11(apiUrl);

Спасибо, что прочитали полностью.

Приятного обучения!!