2013-12-08 32 views
1

我试图在新的风帆回到客户端之前,在一些名为“城市”的项目列表上添加一些额外变量。 js应用程序。 Sails.js使用Underscore.js来执行基本的函数式编程。sails.js + underscore.js未能将散列项添加到数组中

这里是我目前使用_.each。 (我第一次尝试使用_.map并返回用户,但也没有工作)。

控制台正确地记录每个单独的用户,但cities_with_count在_.each情况下空“[]”,并在_.map情况下,两个未定义的“[未定义未定义]”

User.findByIdIn(user_ids).then(function(users){ 
    var users_with_counts = [] 
    _.each(users, function(user) { 
     Candy.count({ type: "yummy").then(function(candy_count){ 
     user.candy_count = candy_count 
     console.log(user); 
     users_with_count.push(user); 
     }); 
    }); 

    console.log(users_with_count); 
    res.view({ 
     users: users_with_count 
    }); 
    }); 

回答

0

下划线环通过用户同步,然后为每个用户它发出异步请求:

Candy.count({ type: "yummy").then(function(candy_count){ 
... 
}); 

通过_.each循环结束时,请求可能没有必要全部被处理,因为没有办法知道当答复将来自后端和whic h命令。

当代码在阵列上发生时users_with_counts尚未填充,导致不需要的行为。

处理这些场景的一种方法是使用计数器来查看在哪里做了多少个计数查询,并且只有在所有查询完成时才继续使用逻辑。要么执行seInterval并定期检查计数器的值,要么在填充阵列后添加if条件以查看程序是否可以继续。

但是如果发生错误,您的程序将挂起,最好的长期选择是使用promises库,例如q

+0

无论如何强迫这些计数是同步的吗? – ajbraus

+0

不,它实际上是不可能的,它与节点的整个事情几乎所有来自核心和库的API都是同步的,这是设计。目标是永远不会阻塞事件线程,因为只有一个这样的线程,并阻止它会阻止服务器。这会导致代码有很多回调函数(请参阅回调函数)http://stackoverflow.com/questions/18095107/callback-hell-in-nodejs来处理异步调用。另一种选择是像q这样的promise类库,希望它有所帮助。 –