我不理解nodejs中的回调。
我需要从数据库中获取播客编号并在我的代码中使用它
我现在从console.log
获得<ul class="List">
<div> one </div>
<div> two </div>
<div> three </div>
<div> four </div>
<div> five </div>
</ul>
node.js中是否有任何解决方案从数据库中获取变量并在代码中稍后重用?
[Function: index]
答案 0 :(得分:2)
看起来我不想在Node.js中做什么
完全有可能。只是,你需要使用异步API,这会让它变得很麻烦。
node.js中是否有任何解决方案从数据库中获取变量并在代码中稍后重用?
不完全是。当您连接到数据库时 - 顺便说一句,异步执行任何操作,例如通过http获取内容或从光盘读取内容 - 您无法直接分配 thing :
var myUserFromDb = User.find('john doe', function(err, res){...}); //this will fail
因为你传递的那个函数作为第二个参数将来会在某个时候执行。 User.find()
本身不会返回用户。
所以,遗憾的是,你不能让用户进入user
var并将其传递给另一个模块 -let说一个播客模块 - 。
然而,假设你有一个'user.js'模块,公开了一个withUser
方法而不是为用户提供数据库,然后用户调用提供的函数,当db调用解决时。
让我们假设您有一个'podcast.js'文件/模块,其中getPodcast
方法需要用户。
getPodcast
不能只询问'user.js'用户。但是,它可以要求一个将作为参数传递的用户运行的函数:
<强> user.js的强>
function withUser(callback){
User.find({_id: 1}, (err, user)=> {
callback(user);
})
}
<强> podcast.js 强>
function getPodcast(){
withUser( function(user){
//now we really have the user inside podcast.js, and we can work with it.
//Sadly, that will surely involve more asynchronous api's, which is painful.
})
}
现在getPodcast
可以在其参数回调中访问用户。
有没有更简单的方法而不是回调?
是的,您应该read about promises。使用承诺时,事情会变得更加痛苦。承诺api将起作用:
<强> user.js的强>
function getUser(id){
//let's say we return a promise that wraps the `User.find` database request
}
<强> podcast.js 强>
getUser(userId).then(user => getPodcast(user)).then(podcastResult => ...)
这看起来不太好。但是,当您使用promise api时,您可以开始使用async/await。
<强> podcast.js 强>
async function getPodcast(userId){
const user = await User.getUser(uesrId);
const otherAsyncThing = await ...someAsyncApiCall;
doAnythingWithUser(user); //this line won't execute until user is resolved, even if there aren't callbacks involved :-D
}
最后,未经提及的建议:在使用node.js时,请确保在编写大量代码之前了解回调api和异步事件是如何工作的。否则,你将得到真正的耦合和简单的代码,其中对象通过大量的回调传递,代码是不可读的和不可判断的:-D
答案 1 :(得分:1)
PS。编辑跟随问题。
想想这样,你到一家餐馆,坐下来问女服务员喝咖啡。但与此同时,你没有被冻结,你正在移动,做事,说话,所以一旦你的咖啡准备好了,女服务员就会把它带给你,你就会停止你正在做的其他事情并喝咖啡。
所以,它会变成这样:
User.findOne({ sessionID: this.event.session.sessionId }).exec().then(data => {
console.log(data);
}).catch(err => {
console.log(err);
});