Работа с Узлом и Экспрессом с Вавилонкой и попытка найти оптимальный подход между асинхронным/ожиданием и обещаниями.Узел и async/ждут, обещает ... какое решение лучше?
Основные требования:
- , чтобы быть в состоянии передать свою собственную ошибку
- не вызывают блокирование
- подойти к проблеме более ES6/ES7 путь
Я вышел с эти:
Посылы:
loadByIdPromises: function (req, res, next, _id) {
console.log('loadByIdc: ', _id);
Artwork.loadById({ _id })
.then((artwork) => {
req.artwork = artwork;
next();
})
.catch((err) => next(new NoDataError('cannot find by ID')));
}
Асинхронный/Await:
loadByIdAsync: async function (req, res, next, _id) {
console.log('loadByIdb: ', _id);
try {
req.artwork = await Artwork.loadById({ _id });
next();
} catch (err) {
next(new NoDataError('cannot find by ID'));
}
}
или Асинхронный/Await с оболочкой
let wrap = fn => (...args) => fn(...args).catch(args[2]);
loadByIdAsyncWrap: wrap(async function (req, res, next, _id) {
console.log('loadByIda: ', _id);
req.artwork = await Artwork.loadById({ _id });
next();
}),
Обещания, кажется чистым, но может привести к каскадные, когда дела идут сложнее. Но имеет хорошую и чистую обработку ошибок.
Async/Await кажется чистым, но я не могу понять, как выбросить ошибку из ждущего другого пути, чем вся попытка try/catch.
Async/Await with wrapper кажется простым и (по крайней мере, в этом случае - маршрутизатором с узлом-экспрессом) хорошо обрабатывает ошибку (но без возможности установить мой собственный). Но обертка специфична для req, res, следующих параметров, и мне кажется, что это нечто чужое (как дополнительные divs в html до нашего блаженства css2/3).
Какой подход выбрать? Спасибо за предложения.
Вы посмотрели на koa: https://github.com/koajs/koa? –
у вас есть потенциальная проблема в вашей версии на основе Promise и, возможно, в других - любое исключение, вызванное вызовом 'next()', может закончиться распространением резервной копии цепочки. Вероятно, вы хотите «load(), затем (do_stuff). Then (next, (err) => next (new Error))' – Alnitak
Что не так с использованием 'try' /' catch' для обработки ошибок? –