我目前正在后端开发一个带有TypeScript的MEAN项目。一切都很好。但是,我想知道以下代码块:
TodoSchema.static('createTodo', async (newTodo: ITodo) => {
return await Todo.create(newTodo)
.then((result: ITodo) => result)
.catch((error: MongoError) => error);
});
上面的代码块工作正常,但我认为async/await
看起来有点多余。下面是调用上述函数的代码块:
const result = await Todo.createTodo(newTodo);
if (result instanceof MongoError) TodoController.resolveErrorResponse(res, result.message, 500, result);
if ((typeof(result)) === 'undefined' && !result) TodoController.resolveErrorResponse(res, 'Error saving Todo', res.statusCode);
一切都在这里正确回归。但是,正如我所说,我觉得它有点多余,我拿出了then/catch
块:
TodoSchema.static('createTodo', async (newTodo: ITodo) => {
return await Todo.create(newTodo);
});
我收到了这个错误:
(node:1306) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 1): MongoError: E11000 duplicate key error index: jaanartc.todos.$slug_1 dup key: { : "test-title" }
根据我的理解(我可能在这里可能是错误的),return await Todo.create(newTodo)
应该返回create()
的结果。所以,如果我检查instanceof MongoError
,我想我应该没事。
请赐教。谢谢。
在采用异步/等待工作流时,我认为有两种选择:
TodoSchema.static('createTodo', async (newTodo: ITodo) => {
return await Todo.create(newTodo);
});
// later on in code
try { const item = await TodoModel.createTodo({...}); }
catch (e) { // do something }
要么
TodoSchema.static('createTodo', async (newTodo: ITodo): Promise<TodoInstance | null> => {
try { return await Todo.create(newTodo); }
catch (e) { return null; }
});
// later on in code
const item = await TodoModel.createTodo({...});
if (!item) {
// something went wrong
}
item.remove() // this is safe now
我会采用第二种方法,因为否则会很头疼