2015-01-18 4 views
5

.node.js Heyecan API imleçleri

Heyecan API tek GET isteğinden 5000 sonuçlarına kadar döner.

Sorgulama yaptığım kullanıcının 5000'den fazla takipçisi varsa, verilerle birlikte "next_cursor" değeri döndürülür.

Bir sonraki 5000 sonucu elde etmek için, GET işlevini yeniden çalıştırmalı ve "next_cursor" değerini bir argüman olarak iletmeliyim. Sadece nasıl yapılacağını göremiyorum. Açıkçası

var cursor = -1 

while (cursor != 0) { 

    T.get('followers/ids', { screen_name: 'twitter' }, function (err, data, response) { 

    // Do stuff here to write data to a file 

    cursor = data["next_cursor"]; 

    }) 

} 

Ben JS deha değilim, bu yüzden herhangi bir yardım çok takdir:

Bir süre döngü düşünüyordum ama küresel değişkeni sıfırlamak olamaz, çünkü kapsam düşünüyorum .

cevap

7

Yapmakta olduğunuz sorun, Node.js'nin asynchronous olmasıdır.

T.get('followers/ids', { screen_name: 'twitter' }, function getData(err, data, response) { 

    // Do stuff here to write data to a file 

    if(data['next_cursor'] > 0) T.get('followers/ids', { screen_name: 'twitter', next_cursor: data['next_cursor'] }, getData); 

    }) 

} 

unutmayın:

  1. Ben iç geri arama işlevi bir isim verdi. Bu, onu içten tekrar çağırabiliriz.
  2. döngü yinelemeli geri arama ile değiştirilir.
  3. Bir sonraki satır öğesi verisi varsa, getData aynı işlevi kullanarak T.get numaralı telefonu ararız.

(sonraki çizelgeler olması gibi birçok gibi) burada kodu Do şeyler defalarca çalıştırılacaktır unutmayın. Yinelemeli geri arama olduğundan - sipariş garanti edilir.


Eğer özyinelemeli geri aramaları fikrini sevmiyorum varsa, bunu önleyebilirsiniz: Tüm next_cursor 'ın mümkünse önceden dışarı bulma

  1. ve için kullanarak istekleri oluşturmak döngü.
  2. Alternatif olarak, Async gibi eşzamansız yardımcı modülleri kullanın (öğrenim amaçlı olarak, zaten kavramda akıcı olmadıkça modülleri kullanmak istemiyorum).
+0

Yardımlarınız için çok teşekkür ederim. Bu bana mantıklı geliyor (ve tabii ki işler).Async'i araştırmıştım ama muhtemelen önerdiğin gibi kendimden geçiyordum. – user1385827

0

Bununla mücadele etti .. Her şey işe yaradı gibi görünüyordu, ancak veri ['next_cursor'] değişmedi, EVER!

Kod böyle olmalı: twit için

T.get('followers/ids', { screen_name: 'twitter' }, function getData(err, data, response) { 

    // Do stuff here to write data to a file 

    if(data['next_cursor'] > 0) T.get('followers/ids', { screen_name: 'twitter', cursor: data['next_cursor'] }, getData); 

    }) 

} 

Parametre sadece "imleç" var, "next_cursor" değildir;)

1

bazı 5K + hesabıyla test düşünün.

const T = new Twit(tokens) 

    function getFollowers (screenName, followers = [], cur = -1) { 
     return new Promise((resolve, reject) => { 
     T.get('followers/ids', { screen_name: screenName, cursor: cur, count: 5000 }, (err, data, response) => { 
      if (err) { 
      cur = -1 
      reject(err) 
      } else { 
      cur = data.next_cursor 
      followers.push(data.ids) 
      if (cur > 0) { 
       return resolve(getFollowers(screenName, followers, cur)) 
      } else { 
       return resolve([].concat(...followers)) 
      } 
      } 
     }) 
     }) 
    } 

    async function getXaqron() { 
     let result = await getFollowers('xaqron') 
     return result 
    } 

console.log(getXaqron().catch((err) => { 
    console.log(err) // Rate limit exceeded 
}))