我是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:
答案 0 :(得分:2)
我已经解决了问题,我使用了模块readline-sync。我花了3个小时寻找这个答案。
答案 1 :(得分:0)
这是由nodejs异步性质引起的。 你可能必须建立自己的某种队列,如果之前的问题得到解答,只会打印一个新问题。
预计还会有一些模块为你做重担 - 你已经检查了这个吗?
干杯
弗洛里安
答案 2 :(得分:0)
这是因为node.js的异步性质
对于循环,不要等到rl.question的回调被激活(因为该回调是异步的)并且迭代根本不关心回调。
它不仅不等待回调,它还倾向于将最后一次迭代的值传递给每个回调 - 因为通常在任何回调exectutes之前 - 迭代完成并且值作为引用传递给回调,因此回调将可以访问上次迭代的值!
如果您将使用阻止(同步)模块,您的整个应用程序将阻止。如果它的脚本,它的确定,但如果它的Web服务器 - 所有客户端将被每个同步操作阻止。
通常 - nodejs默认为#34;"异步,你必须了解它的含义才能理解你的代码在做什么。几乎不可能在nodejs中编写仅同步代码。