为什么这个myFunction()。then()操作似乎无限期挂起?

我遇到了一些非生产代码的麻烦。 我想处理大约3000个数组元素。 如果我epoll_wait(5节点进程,它坐在epoll_wait(5 ,所以我想阻止主线程。

任何人都可以build议要么a)我做错了什么或b)我可以看看执行堆栈/事件循环来检查为什么代码挂? 我试图debugging,并通过代码,并有这个过程工作,但没有更聪明的。

使用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。 我一直在试验蓝鸟的承诺,但是我不确定在这种情况下这是否有用,因为我还没有完全理解承诺。

       

网上收集的解决方案 "为什么这个myFunction()。then()操作似乎无限期挂起?"

你可以尝试使用(蓝鸟)Promise.map迭代asynchronous。

 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); }); });