保存asynchronousfunction的结果供以后使用

我最近开始学习node.js,这是我第一次使用asynchronous函数,但是我无法用头来包装它。 我很难解释我的意思,所以我举个例子。

在下面的代码中,我使用asynchronous库来循环访问一系列twitter用户名,并获取他们最新的tweet(使用twitter库,twitvariables)。 所有的tweet都以结果variables的forms存储在最后一个callback函数中。 相似性是我写的一个函数,它只是返回一个数字。

async.map(screenNames,function(name,callback){ twit.get('/statuses/user_timeline.json', {screen_name: name, count : 1}, function(data) { callback(null,data[0]['text']); }); },function(err,results){ console.log(similarity(results)); }); 

现在说我想每隔X秒使用setInterval重复这个操作,并且每次检查用户是否推特新的东西(即,如果我们刚刚得到的推特与我们以前有的不一样),如果他们有,存储他们的新推特等。
我怎样才能存储他们的推文来比较他们与每个迭代的结果呢?

我试图做到以下没有成功。

 setInterval(function(){ async.map(screenNames,function(name,callback){ twit.get('/statuses/user_timeline.json', {screen_name: name, count : 1}, function(data) { callback(null,data[0]['text']); }); },function(err,results){ console.log(similarity(results)); }); console.log(results+'outside async'); },2000,[screenNames,similarity]); 

这导致了“console.log(results +'asynchronous”);结果未定义“

然后我试了一下

 setInterval(function(){ async.map(screenNames,function(name,callback){ twit.get('/statuses/user_timeline.json', {screen_name: name, count : 1}, function(data) { callback(null,data[0]['text']); }); },function(err,results){ console.log(similarity(results)); }); //console.log(results); },2000,[screenNames,similarity]); 

这导致了一个正确的迭代,然后“callback(NULL,数据[0] ['文本']);不能读取未定义的属性”文本“(我敢肯定,这是不完全相关的)

最后

 setInterval(function(){ async.map(screenNames,function(name,callback){ twit.get('/statuses/user_timeline.json', {screen_name: name, count : 1}, function(data) { callback(null,data[0]['text']); }); },function(err,results){ console.log(results); }); console.log(results+'outside async'); },2000,[screenNames]); 

导致再次在“console.log(结果+”asynchronous之外);结果未定义“

任何人都可以指向我犯了错误的地方吗? 也许这个方法存在缺陷?
非常感谢您阅读我的问题。


编辑:似乎我的相似function以某种方式打破了应用程序。 这是一个非常大的function,所以我会发布一个截断版本。

 function similarity(phrases){ if(phrases.length ==2){ //Lots of stuff //concerning the phrases happen here // and a variable called similarity is produced which //contains a number return similarity; }else{ throw "Can only find similarity between 2 phrases"; } } 

你的第一种和第三种方法是不好的,因为结果只是在async.map的callback中定义的,所以它没有在setInterval中定义。 我没有看到你的第二个问题,但无论如何,我只是这样做:

 var screenNames = [initial data]; var lastTweets = null; setInterval(function(){ async.map(screenNames,function(name,callback){ twit.get('/statuses/user_timeline.json', {screen_name: name, count : 1}, function(data) { callback(null,data[0]['text']); }); },function(err,results){ if ( lastTweets == null ) lastTweets = results else for (var i = 0; i < results.length; i++){ if (lastTweets[i] != results[i] ) { // do something lastTweets[i] = results[i]; } } }); },2000); 

请注意,如果screenNames数组发生变化,那么这将是一个问题,所以我会把它放入一个对象,如下所示:

 var screenNames = [{name:'name', lastTweet:''},...]; setInterval(function(){ async.map(screenNames,function(name,callback){ twit.get('/statuses/user_timeline.json', {screen_name: name.name, count : 1}, function(data) { callback(null,data[0]['text']); }); },function(err,results){ for (var i = 0; i < results.length; i++){ if (screenNames[i].lastTweet != results[i] ) { // do something screenNames[i].lastTweet = results[i]; } } }); },2000);