nodejs在使用readline时暂停

时间:2014-11-01 07:56:29

标签: node.js loops readline

我是nodejs的新手,我正在尝试创建一个交互式shell脚本,它将在我的Facebook墙上回复帖子。问题是当我在循环中使用Readline模块时,它不会停止并继续循环。

这是我的整个代码

var access_token = 'XXX';
var myId = 'XXX';
var FB = require('fb');
var url = require('url');
var utf8 = require('utf8');
var readline = require('readline');

var rl = readline.createInterface({
    input: process.stdin,
    output: process.stdout
});

FB.setAccessToken(access_token);
function getWallFeeds(feedLink, args) {
     FB.api(feedLink, 'get', args, function (res) {
        if (!res || res.error) {
            console.log(!res ? 'error occurred' : res.error);
            return;
        }

        processMessage(res.data);

        var nextLinkParts = url.parse(res.paging.next, true);

        var args = {
            limit: nextLinkParts.query.limit,
            until: nextLinkParts.query.until,
            access_token: nextLinkParts.query.access_token
        }
        getWallFeeds(feedLink, args);
    });
}

function processMessage(data) {
    for (i in data) {
        if (data[i].from.id!=myId) {
            name = data[i].from.name;
            message = data[i].message;
            post_id = data[i].id;
            console.log(post_id + ') ' + name+': '+utf8.encode(message));

            rl.question("Please enter you reply: \n\n", function(answer) {
                // Use answer and call FB api to post to comment..
                rl.close();
            });
        }
    }
}

feedLink = 'me/feed';
getWallFeeds(feedLink, {});

以下是样本结果

1020284792662_1020291351526) John: ....
Please enter you reply:

1020284792662_1020290585671) Ace: How are you!
Please enter you reply:

1020284792662_1020290581815) Nic: Hello there
Please enter you reply:

3 个答案:

答案 0 :(得分:2)

我已经解决了问题,我使用了模块readline-sync。我花了3个小时寻找这个答案。

答案 1 :(得分:0)

这是由nodejs异步性质引起的。 你可能必须建立自己的某种队列,如果之前的问题得到解答,只会打印一个新问题。

预计还会有一些模块为你做重担 - 你已经检查了这个吗?

干杯

弗洛里安

答案 2 :(得分:0)

这是因为node.js的异步性质

对于循环,不要等到rl.question的回调被激活(因为该回调是异步的)并且迭代根本不关心回调。

它不仅不等待回调,它还倾向于将最后一次迭代的值传递给每个回调 - 因为通常在任何回调exectutes之前 - 迭代完成并且值作为引用传递给回调,因此回调将可以访问上次迭代的值!

其他信息:

如果您将使用阻止(同步)模块,您的整个应用程序将阻止。如果它的脚本,它的确定,但如果它的Web服务器 - 所有客户端将被每个同步操作阻止。

通常 - nodejs默认为#34;"异步,你必须了解它的含义才能理解你的代码在做什么。几乎不可能在nodejs中编写仅同步代码。

这里有一些链接可以帮助你:
    SO link
    link 1
    link 2
    SO link 2