Node.js Promiselar


ULASHISH

Promiselarga kirish

Node.js-dagi Promiselar an’anaviy callback funksiyasilarga qaraganda asinxron operatsiyalarni boshqarishning yanada toza usulini taqdim etadi.

Promise’lar asinxron amalning yakunlanishini (yoki muvaffaqiyatsizligini) va uning natijasini ifodalaydi.

Promise holatlari

  • Kutilmoqda: Dastlabki holat, operatsiya tugallanmagan
  • Bajarildi: Amaliyot muvaffaqiyatli yakunlandi
  • Rad etildi: Amaliyot amalga oshmadi

Promise hal bo‘lgach (fulfilled yoki rejected), uning holati boshqa o‘zgarmaydi.


Promiselardan foydalanishning afzalliklari

Callback-lar bilan

getUser(id, (err, user) => {
  if (err) return handleError(err);
  getOrders(user.id, (err, orders) => {
    if (err) return handleError(err);
    // Process orders...
  });
});

Promiselar bilan

getUser(id)
  .then(user => getOrders(user.id))
  .then(orders => processOrders(orders))
  .catch(handleError);

Asosiy afzalliklari:

  • Flatter code structure (avoids callback hell)
  • Bitta .catch() bilan xatoni yaxshiroq hal qilish
  • Operatsiyalarni tuzish va zanjirlash osonroq
  • Parallel operatsiyalar uchun o‘rnatilgan qo‘llab-quvvatlash

Callback hell misoli (Promise’larsiz)

fs.readFile('file1.txt', (err, data1) => {
  if (err) throw err;
  fs.readFile('file2.txt', (err, data2) => {
    if (err) throw err;
    fs.readFile('file3.txt', (err, data3) => {
      if (err) throw err;
      // Use data1, data2, and data3
    });
  });
});

Promiselarni yaratish va ulardan foydalanish

Promiselar ikki parametrli bajaruvchi funksiyani qabul qiluvchi Promise konstruktor yordamida yaratilishi mumkin: resolve va reject .

Asosiy Promise yaratish

// Create a new Promise
const myPromise = new Promise((resolve, reject) => {
  // Simulate an async operation (e.g., API call, file read)
  setTimeout(() => {
    const success = Math.random() > 0.5;
    
    if (success) {
      resolve('Operation completed successfully');
    } else {
      reject(new Error('Operation failed'));
    }
  }, 1000); // Simulate delay
});

// Using the Promise
myPromise
  .then(result => console.log('Success:', result))
  .catch(error => console.error('Error:', error.message));
O‘zingiz sinab ko‘ring »

Misol: Promiselar bilan faylni o‘qish

const fs = require('fs').promises;
const promise1 = Promise.resolve('First result');
const promise2 = new Promise((resolve) => setTimeout(() => resolve('Second result'), 1000));
const promise3 = fs.readFile('myfile.txt', 'utf8'); // Read local file instead of fetch

Promise.all([promise1, promise2, promise3])
  .then(results => {
    console.log('Results:', results);
    // results[0] is from promise1
    // results[1] is from promise2
    // results[2] is the content of myfile.txt
  })
  .catch(error => {
    console.error('Error in one of the promises:', error);
  });
Misolni ishga tushirish »


Promise zanjiri

Asinxron operatsiyalarni ketma-ket bajarish uchun Promiselar zanjirlangan bo‘lishi mumkin, har bir .then() oldingi operatsiya natijasini oladi.

Misol: Promise zanjiri

function getUser(userId) {
  return new Promise((resolve, reject) => {
    // Simulating database call
    setTimeout(() => {
      resolve({ id: userId, name: 'John' });
    }, 1000);
  });
}

function getUserPosts(user) {
  return new Promise((resolve, reject) => {
    // Simulating API call
    setTimeout(() => {
      resolve(['Post 1', 'Post 2', 'Post 3']);
    }, 1000);
  });
}

// Chain the promises
getUser(123)
  .then(user => {
    console.log('User:', user);
    return getUserPosts(user);
  })
  .then(posts => {
    console.log('Posts:', posts);
  })
  .catch(error => {
    console.error('Error:', error);
  });
O‘zingiz sinab ko‘ring »

Promise berish usullari

Namuna usullari

  • then(onFulfilled, onRejected)
    Bajarish yoki rad etish bilan shug‘ullanadi
  • catch(onRejected)
    Rad qilish bilan shug‘ullanadi
  • finally(onFinally)
    Promise bajarilgandan keyin ishlaydi

Statik usullar

  • Promise.all(iterable)
    Barcha Promiselar hal qilinishini kuting
  • Promise.race(iterable)
    Birinchi Promise-ning bajarilishini kutadi
  • Promise.allSettled(iterable)
    Hammasi hal bo‘lishini kutadi

Foydali usullar

  • Promise.resolve(value)
    Qabul qilingan Promise-ni yaratadi
  • Promise.reject(reason)
    Rad etilgan Promise-ni yaratadi

Promise.then()

then() usuli ikkitagacha argumentni oladi. Argumentlar Promise uchun muvaffaqiyat va muvaffaqiyatsizlik holatlari uchun callback funksiyasi qilish funksiyalari.

myPromise
  .then(
    result => console.log(result),
    error => console.error(error)
  );

Promise.catch()

catch() usuli rad etilgan Promiselarni bajaradi va .then(null, errorHandler) ga ekvivalentdir.

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

Promise.finally()

finally() usuli Promise bajarilgan yoki rad etilganidan qat’iy nazar kodni bajaradi.

myPromise
  .then(result => console.log(result))
  .catch(error => console.error(error))
  .finally(() => console.log('Operation completed'));

Parallel bajarish uchun Promise.all()

Promise.all() bir nechta Promiselarni parallel ravishda bajarish uchun ishlatiladi va ularning barchasi bajarilishini kuting. Agar biron bir Promise rad etilsa, u tezda muvaffaqiyatsiz bo‘ladi.

Misol: Bir nechta Promiselarni parallel ravishda bajarish

const fs = require('fs').promises;
const promise1 = Promise.resolve('First result');
const promise2 = new Promise((resolve) => setTimeout(() => resolve('Second result'), 1000));
const promise3 = fs.readFile('data.txt', 'utf8'); // Read local file instead of fetch

Promise.all([promise1, promise2, promise3])
  .then(results => {
    console.log('Results:', results);
    // results[0] is from promise1
    // results[1] is from promise2
    // results[2] is the content of data.txt
  })
  .catch(error => {
    console.error('Error in one of the promises:', error);
  });
Misolni ishga tushirish »

Birinchi natija uchun Promise.race()

Promise.race() bajarilgan yoki rad etilgan birinchi Promise natijasi kerak bo‘lganda foydalidir.

Misol: Promise.race() bilan vaqt tugashi namunasi

const promise1 = new Promise(resolve => setTimeout(() => resolve('First result'), 1000));
const promise2 = new Promise(resolve => setTimeout(() => resolve('Second result'), 500));

Promise.race([promise1, promise2])
  .then(result => {
    console.log('Fastest result:', result);
    // Will log 'Second result' because promise2 is faster
  });
O‘zingiz sinab ko‘ring »

Promiselarni bajarishda xatolik

Xatolarni to‘g‘ri hal qilish muhimdir.

Promiselar xatolarni hal qilishning bir necha usullarini taqdim etadi:

Misol: Promise-dagi xatolik

function fetchData() {
  return new Promise((resolve, reject) => {
    // Simulating an error
    reject(new Error('Network error'));
  });
}

fetchData()
  .then(
    data => console.log('Data:', data),
    error => console.log('Error handled in then:', error.message)
  );

// Alternative method using catch
fetchData()
  .then(data => console.log('Data:', data))
  .catch(error => console.log('Error handled in catch:', error.message));
O‘zingiz sinab ko‘ring »

Eng yaxshi amaliyot: Har doim Promiselar bilan xatolarni qayta ishlashni o‘z ichiga oladi .catch() dan foydalanib, Promiselarni bajarilmagan rad etishning oldini olish uchun, bu jim ishlamay qolishi va xotiraning oqishiga olib keladi.




W3Schools Pathfinder

Yutuqlaringizni kuzating – bu bepul!