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

时间:2016-01-19 10:05:47

标签: node.js

我在使用一些非生产代码时遇到了一些麻烦。我想处理大约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。我一直在试验蓝鸟的承诺,但我不确定在这种情况下这是否有用,因为我还没有完全理解承诺(还)。

1 个答案:

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