我在使用一些非生产代码时遇到了一些麻烦。我想处理大约3000个数组元素。如果我对节点进程进行了分析,那么它位于epoll_wait(5
,因此我可能阻止了主线程。
任何人都可以建议a)我做错了什么或b)我如何看待执行堆栈/事件循环来检查代码挂起的确切原因?我试图调试并逐步执行代码并使该过程正常工作但不是更明智的。
使用Promises.map更新代码:
connection.query(firstPostQuery,{ x: whiteListString }, function( err, rows ) {
Promise.map(rows, function(result) {
return sfs.isSpammer({
ip: result.ip,
email: result.email,
username: result.poster
}).then(function(res) {
console.log(parseInt(res.username.appears) == 1); //evaluates to true
if (parseInt(res.username.appears) == 1 ) {
console.log(res.toJSON());
fs.appendFile(__dirname + '/stopforumspam.txt', res.poster + '\n',
function(err) {
if (err) {
throw err;
}
return true;
});
} else {
fs.appendFile(__dirname + '/stopforumspam.txt',
'nope\n',
function(err) {
if (err) {
throw err;
}
return true;
});
}
});
//Iteration completed
}, {concurrency: 5}).then(function(result) {
//Do something with result
console.log(result);
}).catch(function(err) {
//Error
});
});
我正在运行node.js 4.2.4。我一直在试验蓝鸟的承诺,但我不确定在这种情况下这是否有用,因为我还没有完全理解承诺(还)。
答案 0 :(得分:1)
您可以尝试使用(bluebird)Promise.map来迭代异步。
connection.query(firstPostQuery, {x: whiteListString}, function(err, rows) {
Promise.map(rows, function(result, index) {
console.log('item', index);
return new Promise(function(resolve, reject) {
sfs.isSpammer({
ip: result.ip,
email: result.email,
username: result.poster
}).then(function(res) {
console.log('In Promise', res);
console.log(parseInt(res.username.appears) == 1); //evaluates to
// true
if (res && parseInt(res.username.appears) == 1) {
return fs.appendFile(__dirname + '/stopforumspam.txt', res.poster + '\n',
function(err) {
console.log('In AppendFile spamer');
if (err) {
reject(err);
}
resolve(true);
});
} else {
return fs.appendFile(__dirname + '/stopforumspam.txt',
'nope\n',
function(err) {
console.log('In AppendFile good user');
if (err) {
reject(err);
}
resolve(true);
});
}
});
});
}).then(function(res) {
console.log(res);
}).catch(function(err) {
console.log(err);
});
});