Ожидаемые ошибки и 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
мы можем асинхронно создавать/обновлять все необходимые проектные документы перед запуском приложения.