[英]array push is now filling the array in node.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);
});
};
好吧,您嵌套了許多異步動作,並且在繼續執行外部循環之后執行了一些動作:-)特別地,您忘記了將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
的回調中分析datum.comments.data
看起來很奇怪-它會修改其輸入對象嗎? 還是可以並行處理?
同樣,將回調樹重新構造為具有在其他地方聲明的描述性名稱的單個函數也將很有幫助。 特別是對於profanity_service.analyzeFeedItem
的重復回調(將result
s推送到數組中),將從中受益。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.