Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/375.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 等待isn';不要等待承诺来解决_Javascript_Node.js_Typescript_Express_Async Await - Fatal编程技术网

Javascript 等待isn';不要等待承诺来解决

Javascript 等待isn';不要等待承诺来解决,javascript,node.js,typescript,express,async-await,Javascript,Node.js,Typescript,Express,Async Await,大家晚上好 我已经在这个问题上停留了一段时间,我似乎无法通过纯谷歌搜索来解决它,所以我向你们所有人伸出了援助之手 上下文: 我正在编写一个小应用程序,处理我们公司所有实习生的所有日历和基本项目信息,因为我的老板经常问我他们在干什么,我想给他一些他可以看的东西,所以我决定用代码解决这个问题,同时在这个过程中学习一个新的框架(Express) 现在我已经设置好我的路线,我已经设置好我的控制器,我已经设置好我的DB游标。当我调用我定义的路由时,它运行getAllUsers()控制器函数,在该控制器函数

大家晚上好

我已经在这个问题上停留了一段时间,我似乎无法通过纯谷歌搜索来解决它,所以我向你们所有人伸出了援助之手

上下文: 我正在编写一个小应用程序,处理我们公司所有实习生的所有日历和基本项目信息,因为我的老板经常问我他们在干什么,我想给他一些他可以看的东西,所以我决定用代码解决这个问题,同时在这个过程中学习一个新的框架(Express)

现在我已经设置好我的路线,我已经设置好我的控制器,我已经设置好我的DB游标。当我调用我定义的路由时,它运行getAllUsers()控制器函数,在该控制器函数中,它使用DB游标上的getAllUsers()函数调用数据库,我希望代码在继续之前等待DB游标返回其结果,但事实并非如此,我无法找出原因。DB cursor代码确实有效,因为它可以获取数据并将其很好地注销

如果您有任何帮助,我们将不胜感激,我已经在下面列出了三位有问题的代码,如果您需要我展示更多,请告诉我

p、 让我们忽略“here1”、“here2”等呼叫,这就是我如何计算出在任何时间点发生的事情

路由。ts

从“express”导入express;
从“/controller.js”导入控制器;
导出默认值(应用程序:express.Application)=>{
//使用者
app.route('/users').get(controllers.getAllUsers)
app.route('/users').post(controllers.postNewUser)
app.route('/users').delete(controllers.deleteUser)
app.route('/user/:emailAddress').get(controllers.getUser)
app.route('/user/:emailAddress').put(controllers.updateUser)
}
控制器。ts

从“express”导入express;
从“../services/dbcursor.js”导入dbcursor;
//接口
从“../services/interfaces.js”导入{Project,User}
常数控制器={
//使用者
getAllUsers:async(请求:express.Request,res:express.Response)=>{
试一试{
const dbRes=await dbcursor.getAllUsers();
console.log('here3',dbRes)
res.status(200).json({
消息:“用户已成功获取!”,
dbRes:dbRes
});
}捕捉(错误){
res.status(400).json({
消息:“无法获取用户”,
dbRes:err
});
}
},
}
dbcursor.ts

从“dotenv”导入dotenv;
从“mongodb”导入mongodb
dotenv.config();
//接口
从“/interfaces”导入{User,Project}
//数据库客户端创建
const{MongoClient}=mongodb;
const uri=process.env.DB|u uri|
const client=new MongoClient(uri,{useNewUrlParser:true,useUnifiedTopology:true});
常数dbcursor={
//使用者
getAllUsers:async()=>{
让dbRes;
试一试{
等待客户端连接(异步错误=>{
如果(错误)抛出错误;
log(“这里是1”,dbRes)
const collection=client.db(“InternManager”).collection(“用户”);
dbRes=await collection.find().toArray()
log(“这里2”,dbRes)
返回dbRes;
});
}捕获(错误:任何){
返回错误;
}
},
}

将回调和承诺混为一谈通常不是一个好主意。尝试不将回调传递给
客户端.connect
方法,您应该能够
按预期等待承诺

getAllUsers:async()=>{
让dbRes;
试一试{
等待client.connect();
log(“这里是1”,dbRes)
const collection=client.db(“InternManager”).collection(“用户”);
dbRes=await collection.find().toArray()
log(“这里2”,dbRes)
返回dbRes;
}捕获(错误:任何){
throw err;//如果只是捕获并抛出错误,那么忽略它就可以了
}
},

它看起来不像是
客户端。connect
产生一个承诺,因为它需要回调。所以,等待它不会有任何作用。另外,
return dbRes
从回调返回它不适用于
getAllUsers
每天,这里有几十个问题,人们在某个操作前抛出一个等待,并期望它能带来奇迹。Wait仅在等待与异步操作完成相关的承诺时才执行有用的操作。而且,如果您将回调传递给某个函数,那么它几乎总是不会返回承诺。我建议您阅读中的10条承诺/等待指南,因为其中有几条适用于您。谢谢@Shadab解决了这个问题,当您指出它时,它看起来很简单。有没有理由认为把它们混在一起不是一个好主意,或者只是为了防止像我这样的混乱发生?