Мы видели много разных объяснений обратного вызова в 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);
Спасибо, что прочитали полностью.
Приятного обучения!!