与Babel一起使用Node和Express并试图找出异步/等待和承诺之间的最佳方法。节点和异步/等待,承诺...哪个解决方案最好?
主要要求:
- 能够通过我自己的错误
- 不会造成阻塞
- 来解决这个问题更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')));
}
异步/等待:
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'));
}
}
或异步/等待与包装
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();
}),
承诺似乎是干净的,但可能会导致级联当事情复杂。但有一个很好,干净的错误处理。
异步/等待看起来很干净,但我无法弄清楚如何从整个try/catch的事情等待其他方式抛出错误。
异步/等待与包装看起来很简单,并且(至少在这种情况下 - 节点快速路由器)处理错误(但没有可能设置我自己的)。但包装是特定于请求,水库,下一个参数,在我看来是外来的东西(比如我们的css2/3幸福之前的html中额外的div)。
什么方法可供选择?感谢您的建议。
你看看koa:https://github.com/koajs/koa? –
你在基于Promise的版本中可能存在潜在的问题,也许在其他版本中可能存在问题 - 在调用next()时引发的任何异常都可能最终传播回链。你可能想要'load()。then(do_stuff).then(next,(err)=> next(new Error))' – Alnitak
使用'try' /'catch'进行错误处理有什么问题? –