Node.js和Database变量中的回调

时间:2017-10-26 11:47:15

标签: javascript node.js

我不理解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]

2 个答案:

答案 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);
});