【问题标题】:nodejs pause when using readline使用readline时nodejs暂停
【发布时间】:2014-11-01 07:56:28
【问题描述】:

我对 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:

【问题讨论】:

    标签: node.js loops readline


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      for 循环不要等到 rl.question 的回调被执行(因为回调是异步的)并且迭代根本不关心回调。

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

      附加信息:

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

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

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

      【讨论】:

        【解决方案3】:

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

        当然也有模块为您完成繁重的工作 - 您是否已经检查过这个?

        干杯

        弗洛里安

        【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-11-02
        • 2021-03-30
        • 1970-01-01
        • 1970-01-01
        • 2015-10-19
        • 1970-01-01
        相关资源
        最近更新 更多