2013-12-25 6 views
1

Недавно я начал изучать node.js, мой первый подход к асинхронным функциям, но я просто не могу обернуть его вокруг. Я довольно плохо объясняю, что я имею в виду со словами, поэтому приведу пример.Сохранение результатов функции Async для последующего использования

В приведенном ниже коде я использую асинхронную библиотеку для прокрутки массива имен пользователей twitter и получения их последнего твита (используя библиотеку twitter, переменную twit). Все твиты собираются в переменной результатов как массив, который я могу использовать в последней функции обратного вызова. Сходство - это функция, которую я написал, она просто возвращает число.

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 (результаты +„вне асинхронном“), результаты не определен»

Затем я попытался

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, data [0] ['text']); не может прочитать текст свойства undefined (я уверен, что это не совсем связано)

И, наконец,

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 (результаты +« наружу async »); Результаты не определен»

Может кто-нибудь мне точку, где я сделал ошибку? Может быть, недостаток в том, как я подойти к этому?
Спасибо большое за чтение моего вопроса.


EDIT : кажется, что моя функция подобия как-то ломает приложение это довольно большая функция, поэтому я выложу усеченную версию

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"; 
    } 
} 

ответ

1

Вашего первый и третий подход плох, потому что результаты просто определены в обратном вызове асинхроннома.. .map, поэтому он не определен в 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); 
+0

Это работает отлично, пока я не попытаюсь использовать функцию, которую я написал. Он работает правильно во время первой итерации и разбивается на вторую с этой ошибкой: «строка не является функцией». Любая идея, что может быть причиной этого? –

+0

Nevermind, получается, что это не связанная проблема, я отправлю еще один вопрос. Большое спасибо за ответ! –

Смежные вопросы