array push现在正在node.js中填充数组

时间:2013-06-04 10:18:01

标签: javascript node.js async.js

我正在推送messages_filtered数组中的数据但是当我试图在回调中获取它时它总是空的。我在异步循环中推送数据两次。 retMessages是从messages_filtered创建的,但它是空的,因此retMessages始终为空。

Service.poll = function(user, callback) {
  var messages_filtered = [];
  async.forEach(activeAccountsFor(user), function(acct, done) {
    graph.setAccessToken(acct.accessToken);
    var connections = ['feed', 'links', 'tagged', 'posts', 'notes', 'inbox', 'outbox'];
    var args = acct.updated_time ? {since: acct.updated_time - 3000} : {};
    args['date_format']= 'U';
    User.markAsUpdated(user._id);
    User.markAccountAsUpdated(user._id, acct.userID);
    async.forEach(connections, function(connection, next) {

      graph.setOptions(options).get('me/' + connection, args,
        function(err, feed) {
          if (err) {
            winston.log('error', 'Error in connection ');
            return done();
          }
          async.forEach(feed.data, function(datum, onward) {
            profanity_service.analyzeFeedItem(datum, function(err, result) {
              if(!_.isUndefined(datum.comments)){
                if(!_.isUndefined(datum.comments.data) && !_.isEmpty(datum.comments.data) ){
                  _.each(datum.comments.data, function(data){
                    if(moment(data.created_time).unix() >= user.updated_time){
                      profanity_service.analyzeFeedItem(data, function(err, result) {
                        if(!err && result){
                          if (result.isProfane){
                              messages_filtered.push(result);
                          }
                        }
                      });
                    }
                  });
                }
              }
              if(!err && result){
                if (result.isProfane) {
                    messages_filtered.push(result);
                } 
              }
              onward(err);
            });
          }, next);
        });
    }, done);
  }, function(err) {
    console.log('messages_filtered.length ' + messages_filtered.length);
    if (messages_filtered.length > 0) {
      var retMessages = [];
      _.each(messages_filtered, function(message) {
        if (!hasMessage(retMessages, message)) {
          retMessages.push(message)
          Message.flag(user._id, message);
        }
      });
      user.notify(retMessages);
    }
    callback(err);
  });
};

1 个答案:

答案 0 :(得分:0)

好吧,你有很多异步动作嵌套,有些是在你继续使用外循环后执行的:-)具体来说,你忘了将onward调用延迟到最内层profanity_service.analyzeFeedItem已经完成了。它应该是

… function(datum, onward) {
    profanity_service.analyzeFeedItem(datum, function(err, result) {
      if(!err && result){
        if (result.isProfane) {
            messages_filtered.push(result);
        } 
      }
      if(!_.isUndefined(datum.comments)
         && !_.isUndefined(datum.comments.data)
         && !_.isEmpty(datum.comments.data)
      ) {
        async.forEach(datum.comments.data, function(data, forward){
//      ^^^^^^^^^^^^^
          if(moment(data.created_time).unix() >= user.updated_time){
            profanity_service.analyzeFeedItem(data, function(err, result) {
              if(!err && result){
                if (result.isProfane){
                  messages_filtered.push(result);
                }
              }
              forward(err);
            });
          } else {
            forward();
          }
        });
      } else {
        onward(err);
      }
    } …

顺便说一下,在分析datum.comments.data的回调中分析datum看起来很奇怪 - 是否修改了它的输入对象?或者你能和它们平行吗?

此外,将回调树重组为具有在其他地方声明的描述性名称的单个函数会很有帮助。特别是profanity_service.analyzeFeedItem的重复回调会在阵列上推送result,这将从中获益。