Javascript 在Express中从mongoDB检索到所有数据后回调函数的正确方法?

Javascript 在Express中从mongoDB检索到所有数据后回调函数的正确方法?,javascript,angularjs,node.js,mongodb,Javascript,Angularjs,Node.js,Mongodb,我正在编写一个带有消息功能的web应用程序 我的应用程序中的对话定义为两个不同用户之间的对话。例如,如果Adam刚刚创建了一个配置文件,并向Jane发送了1条消息,向Jack发送了3条消息。他会有2次对话,但总共有4条信息 在Express端的以下代码中,我试图检索数据库中给定用户的所有对话。 完成后,将此数据发送到角度控制器侧。 考虑到js是异步的,在下面的api.js中正确的方法是什么 public/javascripts/main_controller.js var mainApp = a

我正在编写一个带有消息功能的web应用程序

我的应用程序中的对话定义为两个不同用户之间的对话。例如,如果Adam刚刚创建了一个配置文件,并向Jane发送了1条消息,向Jack发送了3条消息。他会有2次对话,但总共有4条信息

在Express端的以下代码中,我试图检索数据库中给定用户的所有对话。 完成后,将此数据发送到角度控制器侧。 考虑到js是异步的,在下面的api.js中正确的方法是什么

public/javascripts/main_controller.js

var mainApp = angular.module('myApp', ['ngRoute', 'btford.socket-io', 'xeditable']);
...
mainApp.controller('MessagesController', function($scope, $http, userSessionService, socket, focus){
  console.log("MessagesController running");
  $scope.messageDisplay = '';
  $scope.username = userSessionService.getUserSession().username;

  $http({
      url: '/loadConversations', 
      // url: '/about', 
      method: "GET"
    })
    .success(function(response) {
      console.log("success with loadConversations: ", response);
      console.log(response[0].data);
    });
....
})
路由/api.js:

router.route(“/loadConversations”)
.get(已验证,函数(req,res){
var结果=[];
//查找与每个和所有不同用户的对话
for(变量i=0;i
}
});

我不确定您是否要求这样做,但我认为您应该稍微重写一下控制器代码

在本例中,承诺在
$http(…)
之后返回。而不是使用。success我建议使用。然后。理解两者之间的区别很重要,因此我将尝试简要解释。以下是源代码中的
.success()
方法:

promise.success = function(fn) {
// ...
promise.then(function(response) {
    fn(response.data, response.status, response.headers, config);
});
    return promise;
};
这是他们的

.success
相同。然后,除了
success
之外的
将采用成功调用结果的第一个参数,因此您不必写出
响应。数据。这有点方便,但是如果你曾经使用缓存或者想要将其他承诺与之捆绑在一起,这就成了一件让人头疼的事。下面是我给你的选择

$http({
  url: '/loadConversations', 
  // url: '/about', 
  method: "GET"
})
.then(function(response) {
  // this is your success callback
  console.log("success with loadConversations: ", response);
  console.log(response[0].data);
}, function(error) {
  // if the service call doesnt return 200, we fire this
  console.log(error); 
});
此控制台日志将在此实现中异步执行,并且比使用
更易于维护。如果成功

编辑:对于routes/api.js,我认为您只需要返回
结果
数组

if(result.length == req.user.conversations.length){
  return result;
}

我不确定你是否要求这样做,但我认为你应该稍微重写一下你的控制器代码

在本例中,承诺在
$http(…)
之后返回。而不是使用。success我建议使用。然后。理解两者之间的区别很重要,因此我将尝试简要解释。以下是源代码中的
.success()
方法:

promise.success = function(fn) {
// ...
promise.then(function(response) {
    fn(response.data, response.status, response.headers, config);
});
    return promise;
};
这是他们的

.success
相同。然后,除了
success
之外的
将采用成功调用结果的第一个参数,因此您不必写出
响应。数据。这有点方便,但是如果你曾经使用缓存或者想要将其他承诺与之捆绑在一起,这就成了一件让人头疼的事。下面是我给你的选择

$http({
  url: '/loadConversations', 
  // url: '/about', 
  method: "GET"
})
.then(function(response) {
  // this is your success callback
  console.log("success with loadConversations: ", response);
  console.log(response[0].data);
}, function(error) {
  // if the service call doesnt return 200, we fire this
  console.log(error); 
});
此控制台日志将在此实现中异步执行,并且比使用
更易于维护。如果成功

编辑:对于routes/api.js,我认为您只需要返回
结果
数组

if(result.length == req.user.conversations.length){
  return result;
}