Promise.all'daki hataları yakalayın

Javascript's Promise.all'a güvenli bir alternatif

Hatalar dahil tüm sözleri bekliyorum

Javascript geliştiricisiyseniz, büyük olasılıkla standart yerleşik nesne Promise'i ve bir dizide verilen tüm vaatler çözülene kadar bekleyen API Promise.all'i kullanmışsınızdır. Bu, iş mantığınıza devam etmeden önce çeşitli eşzamansız sonuçları beklemenin çok zarif bir yoludur.

Ancak bu API, hataları işlemez. Söz dizisinde en az bir hata oluştuğunda, işlev hemen durur ve başka sonuç beklenmez.

Promise.allSettled tüm zaman uyumsuz sonuçları bekliyor

Neyse ki, sonuç geçerli veya bir hata olsun, tüm vaatleri beklemeyi garanti eden Promise.allSettled adlı ikinci bir API var. Aşağıdaki kod, gerçekten basit olan kullanımını gösterir, ancak sizi çok fazla baş ağrısından kurtarabilir.

Promise.all ile arasındaki temel fark, her bir sözün, hem durumun (yerine getirildiği veya reddedildiği) hem de değerin (yerine getirilmesi durumunda) veya nedeninin (reddedilmesi durumunda) mevcut olduğu bir dizi bilgiye çözümlenmesidir. .

Boş bir dizi sağlama

Dikkat etmeniz gereken özel bir durum, Promise.allSettled girdi olarak boş bir dizi aldığında, hemen boş bir diziye dönüşmesidir. Bu kulağa mantıklı geliyor ve beklenen davranış ama yine de belirtmek istedim.

/**
 * A simple dummy function that
 * fetches data from multiple
 * endpoints related to a user.
 */
async function fetchUserData(id){
  // A simple array of promises.
  // The first two parameters are
  // mock calls from down below.
  const promises = [
    fetchUserHistory(id),
    fetchUserProfile(id),
    // For testing only, let's throw.
    Promise.reject(new Error('an error'))
];
  
  const values = await Promise.allSettled(promises);
  // values === [
  //    { status: "fulfilled", value: [1, 2, 3] },
  //    { status: "fulfilled", value: {name:"dummy"} },
  //    { status: "rejected", reason: {}
  // ]
}

// The following functions are just mocks
// and should help improve readability
// of the example at the top.

async function fetchUserHistory(id){
  return Promise.resolve([1,2,3]);
}

async function fetchUserProfile(id){
  return Promise.resolve({ name: "dummy" });
}

Gördüğünüz gibi, Promise.allSettled, Promise.all'a çok güzel bir ektir ve sonuçlarından bağımsız olarak tüm sonuçları beklemenize izin verir. Bu API'nin her kullanım durumuna uyacağını düşünmüyorum, ancak sizi zaman uyumsuz çağrıları genel bir try-catch-block'a sarmaktan kurtarıyor.