Ожидаемые ошибки и Promise.all | Кодементор

Promise.all — отличная функция ES6, которая позволяет удивительно легко объединять несколько промисов. Однако все может стать немного сложнее, если не все обещания будут реализованы. Promise.all ожидают успеха.

Рассмотрим случай проектных документов при запуске PouchDB. PouchDB поддерживает промисы и Promise.all было бы хорошим способом создать эти документы до запуска приложения:

import designDocs from './designDocs';

const db = new PouchDB(config.database);

export async function databaseSetup() {
  const designPromises = designDocs.map(designDoc => db.put(designDoc));

  await Promise.all(designPromises);
}

И это работает в первый раз, но не для следующих, потому что PouchDB выдаст ошибку, если вы попытаетесь создать новый документ с тем же _id как существующий. Что еще хуже, нет тривиального способа решить эту проблему. Делает:

  await Promise.all(designPromises).catch((error) => {
    
  });

Только позволит вам обработать первую ошибку, которая произошла во время Promise.all и у вас не будет возможности обрабатывать другие ошибки. К счастью, есть способ обработать эти ожидаемые ошибки до Promise.all пусть он имеет дело только с настоящими непредвиденными случаями ошибок:

import designDocs from './designDocs';

const db = new PouchDB(config.database);

export async function databaseSetup() {
  const designPromises = designDocs.map(designDoc => db.put(designDoc).catch(async 
  (error) => {
    if (error.name !== 'conflict') throw error;

    const existingDesignDoc = await db.get(designDoc._id);
    return db.put({
      ...designDoc,
      _rev: existingDesignDoc._rev,
    });
  }));

  await Promise.all(designPromises);
}

Обрабатывая ожидаемые ошибки до Promise.all мы можем асинхронно создавать/обновлять все необходимые проектные документы перед запуском приложения.

Похожие записи

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *