Javascript 为什么我需要在节点postgres中使用async/await两次
我写的这段代码似乎很有效: database.jsJavascript 为什么我需要在节点postgres中使用async/await两次,javascript,node.js,async-await,es6-promise,node-postgres,Javascript,Node.js,Async Await,Es6 Promise,Node Postgres,我写的这段代码似乎很有效: database.js const {Pool} = require('pg'); const pool = new Pool({ connectionString: process.env.DATABASE_URL, }); module.exports = { query: (text, params) => pool.query(text, params) }; auth_facade.js const database = require('../
const {Pool} = require('pg');
const pool = new Pool({
connectionString: process.env.DATABASE_URL,
});
module.exports = {
query: (text, params) => pool.query(text, params)
};
auth_facade.js
const database = require('../../utils/database');
module.exports.findPersonByEmail = async function(email) {
const query = 'SELECT * FROM Person WHERE email = $1';
const values = [email];
try {
console.log(1);
const {rows} = await database.query(query, values);
console.log(2);
return rows[0];
} catch (err) {
next(err);
}
};
auth_controller.js
const authFacade = require('./auth_facade');
module.exports.signin = async function(req, res, next) {
console.log(0);
var person = await authFacade.findPersonByEmail(req.body.email);
console.log(3);
};
正如我所料,它显示了0123
但是,我不明白为什么我需要在auth_facade::findPersonByEmail
和auth_controller::signin
上使用async/await
为什么,如果我从auth_controller::signin
签名中删除async,并在签名中删除wait
,我将不再得到0123,而是得到0132?难道它不应该被阻止吗?auth_facade?您当前的代码:
一家人去购物中心。(0)爸爸累了,说:“去买点东西吧,我等着,然后我们一起回家。”(1)过了一会儿,女儿说:“我不想进那家商店,我就在这里等你,然后我们再回到爸爸身边。”(2)妈妈买完东西,回到女儿身边,(3)他们都回来接爸爸,然后一起回家
您的代码没有外部等待:
一家人去购物中心。(0)爸爸很累,说“去买点东西吧,我会在这里的。”(1)过了一会儿,女儿说“我不想去那家商店,我就在这里等你,然后我们再回到爸爸身边。”然而,大约在同一时间,(3)爸爸转过身,决定回家,因为等待是为了失败者。(2) 妈妈买完东西回到女儿身边,他们都回来发现爸爸开车走了,他们被困在商场里,手里拿着一堆购物袋
女儿和父亲都需要等待,以便他们不会留下任何人。您当前的代码:
一家人去购物中心。(0)爸爸累了,说:“去买点东西吧,我等着,然后我们一起回家。”(1)过了一会儿,女儿说:“我不想进那家商店,我就在这里等你,然后我们再回到爸爸身边。”(2)妈妈买完东西,回到女儿身边,(3)他们都回来接爸爸,然后一起回家
您的代码没有外部等待:
一家人去购物中心。(0)爸爸很累,说“去买点东西吧,我会在这里的。”(1)过了一会儿,女儿说“我不想去那家商店,我就在这里等你,然后我们再回到爸爸身边。”然而,大约在同一时间,(3)爸爸转过身,决定回家,因为等待是为了失败者。(2) 妈妈买完东西回到女儿身边,他们都回来发现爸爸开车走了,他们被困在商场里,手里拿着一堆购物袋
女儿和父亲都需要等待,以便他们不留下任何人。你需要在两个地方等待的原因是,AuthFacade
和AuthController
,因为你在处理两个不同的承诺:
中的一个findPersonByEmail()
(来自数据库查询)
一个来自findPersonByEmail()
显示:
findPersonByEmail(email: string): Promise<Person>;
//same difference
let person = await authFacade.findPersonByEmail(req.body.email);
//same difference
authFacade.findPersonByEmail(req.body.email).then(person => {
});
findPersonByEmail(email:string):承诺;
//相同差异
let person=等待authFacade.findPersonByEmail(req.body.email);
//相同差异
authFacade.findPersonByEmail(req.body.email)。然后(person=>{
});
如果您想了解更多信息,请阅读:。您需要在两个地方等待的原因是,AuthFacade
和AuthController
,因为您正在处理两个不同的承诺:
中的一个findPersonByEmail()
(来自数据库查询)
一个来自findPersonByEmail()
显示:
findPersonByEmail(email: string): Promise<Person>;
//same difference
let person = await authFacade.findPersonByEmail(req.body.email);
//same difference
authFacade.findPersonByEmail(req.body.email).then(person => {
});
findPersonByEmail(email:string):承诺;
//相同差异
let person=等待authFacade.findPersonByEmail(req.body.email);
//相同差异
authFacade.findPersonByEmail(req.body.email)。然后(person=>{
});
如果您想了解更多信息,请阅读:.如果只需调用authFacade.findPersonByEmail
,则在登录
函数中不需要async/wait
;否则,您“需要”它,因为底层的pool.query
返回一个承诺(因此它是async
)authFacade.findPersonByEmail
是async
,因此它不会阻塞。如果它只调用authFacade.findPersonByEmail
,则在signin
函数中不需要async/Wait
;否则,您“需要”它,因为底层的pool.query
返回一个承诺(因此它是async
)authFacade.findPersonByEmail
是async
,所以它没有阻塞。很好的解释。我的下一个问题是“有没有办法避免只有一个wait/async?”我认为唯一的异步任务应该是数据库查询。换句话说,我能强迫爸爸跟着他的女儿,和她一起在商店门口等妈妈吗?事实上你能。带爸爸一起去就相当于@woozyking所说的:signin
不需要是异步的。很好的解释。我的下一个问题是“有没有办法避免只有一个wait/async?”我认为唯一的异步任务应该是数据库查询。换句话说,我能强迫爸爸跟着他的女儿,和她一起在商店门口等妈妈吗?事实上你能。带上爸爸就相当于@woozyking所说的:signin
不需要是异步的。