2016-12-13 7 views
0

Я пытаюсь проверить Потоки Интернет или на форуме ...NodeJS TwitchAPI онлайн/оффлайн статус

Но у меня есть 1 проблема эта просьба не требуется для всех пользователей .. только 1 или максимум 2 при 1 от он-лайн и 1 вне форума ...

Вот пример: В MySQL 3 Streams test1 test2 test3 test4 (1, 2, 3 и 4 являются потоки ...) (когда ALL offline мой выход - это ...) test4 находится в автономном режиме и это 4 раза.

Сценарий:

var request = require('request'); 
var cheerio = require('cheerio'); 
var parser = require('json-parser'); 
var JSON = require('JSON'); 
var mysql = require('mysql'); 

var connection = mysql.createConnection({ 
    host  : 'localhost', 
    user  : 'status', 
    password : '', 
    database : 'all_channels' 
}); 

connection.query("SELECT * FROM channels", function(error, rows, response, fields) { 
    if (!!error) { 
     console.log('Error in Query!'); 
    } else { 
     for(var i in rows) { 


console.log(rows[i]) 
       request('https://api.twitch.tv/kraken/streams/'+rows[i].channels+'?client_id=(I have removed the ID from intent)', function (error, response, html) { 
     var profileyt = JSON.parse(html); 


if (profileyt["stream"] !== null) { 
         console.log(profileyt["stream"]["channel"]["status"]); 
        } else { 


request('https://api.twitch.tv/kraken/channels/'+rows[i].channels+'?client_id=(I have removed the ID from intent)', ', function (error, response, html) { 
          var profiletest = JSON.parse(html); 


console.log(''+profiletest["display_name"]+' is offline'); 
}) 
}})}}}); 

Консоль вывода: C: \ Bot> узел test2.js

RowDataPacket { channels: 'test1', status: 'offline' } 
RowDataPacket { channels: 'test2', status: 'offline' } 
RowDataPacket { channels: 'test3', status: 'offline' } 
RowDataPacket { channels: 'test4', status: 'offline' } 

Test4 ist offline 
Test4 ist offline 
Test4 ist offline 
Test4 ist offline 

я провел 2-3 дня, пытаясь исправить это, но я до сих пор понятия не имею, ...

+0

, конечно, это потому, что вы выполняете асинхронную функцию внутри цикла for – Beginner

ответ

0

в результате

Test4 ist offline 
Test4 ist offline 
Test4 ist offline 
Test4 ist offline 

, потому что вы звоните rows[i].channels внутрь в асинхронной функции, асинхронная функция также внутри цикла

Смотрите эти

петля уже закончилась или i становится строкой до обратного вызова request2 имеет был вызван именно поэтому он всегда отображается только ваш последний канал

for (var i in rows) { 
     request1('blahblah...', function(error, response, html) { 
      // rows[i].channels this will always displayed your last row data 
      request2(rows[i].channels, function (error, response, html) { 
      }) 
     }) 
    } 
} 

Чтобы решить, что создать отдельную функцию

function getChannelStatus(row) { 
    // now the row will be pass is the correct one istead of the last row like your previous code 
    request('https://api.twitch.tv/kraken/streams/' + row.channels + '?client_id=(I have removed the ID from intent)', function(error, response, html) { 
      var profileyt = JSON.parse(html); 


      if (profileyt["stream"] !== null) { 
       console.log(profileyt["stream"]["channel"]["status"]); 
      } else { 


       request('https://api.twitch.tv/kraken/channels/' + row.channels + '?client_id=(I have removed the ID from intent)', function (error, response, html) { 
        var profiletest = JSON.parse(html); 


        console.log('' + profiletest["display_name"] + ' is offline'); 
       }) 
     } 
    }) 
} 

connection.query("SELECT * FROM channels", function(error, rows, response, fields) { 
    if (!!error) { 
     console.log('Error in Query!'); 
    } else { 
     for (var i in rows) { 

      console.log(rows[i]) 
      getChannelStatus(rows[i]); 
     } 
    } 
});