0

messages_filtered 配列にデータをプッシュしていますが、コールバックで取得しようとすると、常に空になります。非同期ループでデータを 2 回プッシュしています。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);
  });
};
4

1 に答える 1

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特に、配列に sをプッシュするための繰り返しコールバックは、それからresult利益を得るでしょう。

于 2013-06-04T11:00:19.883 に答える