Javascript 是否需要检查父级中的子异步/等待函数是否成功?
如果我有一个MongoDb更新查询,如下图所示——当查询完成并出现错误时,错误将传递给我的父函数——该函数调用Javascript 是否需要检查父级中的子异步/等待函数是否成功?,javascript,node.js,mongodb,Javascript,Node.js,Mongodb,如果我有一个MongoDb更新查询,如下图所示——当查询完成并出现错误时,错误将传递给我的父函数——该函数调用updateQuery()。在这种情况下,我知道函数何时完成处理 如果函数成功(即没有错误)-我是否假设它已成功完成处理 或者我需要返回特定于父函数的内容来确认这一点吗?(即返回True,然后检查其是否为True) 异步函数updateQuery(){ const db=wait mongoUtil.getDb(); 返回等待数据库 .收集(“测试”) .updateOne( { _id
updateQuery()
。在这种情况下,我知道函数何时完成处理
如果函数成功(即没有错误)-我是否假设它已成功完成处理
或者我需要返回特定于父函数的内容来确认这一点吗?(即返回True,然后检查其是否为True)
异步函数updateQuery(){
const db=wait mongoUtil.getDb();
返回等待数据库
.收集(“测试”)
.updateOne(
{
_id:,
},
{
$set:{
参数:“测试”
},
}
)
。然后((结果)=>{
如果(result.nModified!==1){
抛出新错误(“更新错误”);
}
})
}
当您使用
异步等待
时,无需将其与链接。然后
将updateOne
的结果存储在变量中,然后检查条件并抛出一个错误
现在,当您调用updateQuery
时,如果更新操作成功,您将得到一个错误
async function updateQuery() {
const db = await mongoUtil.getDb();
const res = await db
.collection("test")
.updateOne({ _id: "" }, { $set: { param: "test" } });
if (res.nModified !== 1) {
throw new Error("Update Error");
}
}
updateQuery().catch(console.log);
当您使用async
语法时,这意味着函数将返回Promise
。使用async
时,可以在try/catch
块中包装逻辑,如果发生任何错误,它将被发送到catch
块。在这两种情况下(成功或错误),您都应该将值返回给父函数。当然,您可以将错误
发送到错误处理程序
而不是父函数。您可以像这样重构代码:
async function updateQuery() {
try{
const db = await mongoUtil.getDb();
const result = await db.collection("test").updateOne(
{ _id: <id> },
{ $set: { param: 'test' } }
);
return {success: true, result};
} catch(error) {
return {success: false}
}
}
异步函数updateQuery(){
试一试{
const db=wait mongoUtil.getDb();
const result=await db.collection(“test”).updateOne(
{{u id:},
{$set:{param:'test'}
);
返回{success:true,result};
}捕获(错误){
返回{success:false}
}
}
@tbowden请检查这是否解决了您的问题,如果您有任何问题,一定要告诉我。谢谢Som-真的很有帮助-我编写函数的方式有什么大的缺点吗?@tbowden目前没有缺点,因为这只是不必要的代码。但是,假设您使用的是.find
,并且要从函数返回一个文档,那么您就不能在然后回调中执行该操作。@tbowden我希望现在已经清楚了,如果还有什么不清楚的地方,请告诉我。谢谢您的帮助!在您上面给出的关于find
的示例中,我需要返回res
以将结果返回到我的父函数-对吗?谢谢Nenad-您是否可以说它的最佳实践是返回成功/失败,如您的示例所示?我认为我应该这样做,但是我找不到很多例子。干杯有很多不同的练习。我用这个。我正在向父函数发送带有描述性消息和结果的success/fail
响应。之后,您可以根据子函数的返回值在父函数中处理响应。例如,如果发生错误,您可以使用从子函数获得的描述性错误消息向最终用户发送错误响应。另外,如果结果成功,您可以将数据发送给最终用户。这非常感谢!再一次,我在我的项目中的很多地方都使用了promises格式。我假设如果我做一些类似于下面Som答案的事情,我可以添加一个else{return{success:true,result}}
来获得类似的效果?是的,你也可以使用承诺方法。它的语法相同,但不同。
async function updateQuery() {
try{
const db = await mongoUtil.getDb();
const result = await db.collection("test").updateOne(
{ _id: <id> },
{ $set: { param: 'test' } }
);
return {success: true, result};
} catch(error) {
return {success: false}
}
}