2013-06-11 2 views
0

Я видел некоторые подобные вопросы здесь, но ни один из них, похоже, напрямую не связан с этим. Я читаю поток щебета и используя Socket.io испускать его следующим образом:как заставить функцию асинхронного ожидания ждать до конца

stream.on('data', function (data) { 
      var geo=false,latitude,longitude; 

     if(data.geo!=null){ 
      geo = true; 
      latitude = data.geo.coordinates[0]; 
      longitude = data.geo.coordinates[1]; 

     } 
     io.sockets.volatile.emit('tweets', { 
      user: data.user.screen_name, 
      text: data.text, 
      geo : geo, 
      latitude: latitude, 
      longitude: longitude, 
     });  
}); 

И я хочу, чтобы добавить некоторую обработку данных, прежде чем он получает выбрасываются в гнездах. Код для обработки является:

var sentiment; 
sentiment(data.text, function (err, result) { 
    sentiment = result.score; 
}); 

И я хочу, чтобы излучать его как:

io.sockets.volatile.emit('tweets', { 
       user: data.user.screen_name, 
       text: data.text, 
       geo : geo, 
       latitude: latitude, 
       longitude: longitude, 
        sentiment: sentiment 
      }); 

Но я получаю ошибки, которые я думаю, связаны с асинхронным характером обработки. Как я могу принудить его дождаться завершения обработки функции перед выпуском?

+4

Вы не можете сделать его ждать, но вы можете переместить 'вызов io.sockets.volatile.emit' функции в обратный вызов, который вы передаете' настроения '. –

+0

Спасибо, я пробовал это, но получаю сообщение об ошибке: events.js: 74 throw TypeError (событие «Неоткрытый, неуказанный» «событие.»); ^ ТипError: Непредвиден, неопределенное событие "error". – babbaggeii

ответ

2

Вы переписав sentiment функцию:

var sentiment;        <-- declare a var... 
sentiment(data.text, function (err, result) { <-- ..and call it (which fails) 
    sentiment = result.score; 
});