2016-03-24 15 views
0

Bölümlenmiş bir API'yi çağıran bir işlev var. İlk sayfaya ilk çağrıyı yapar, ardından yanıtta geri gönderilen next URL'sini kullanarak sonraki sayfalara istekte bulunmaya devam eder. nextnull olana kadar yapar. Yanıtlardan veri (şehir adları) çıkarmaya çalışıyorum ve bunları küresel bir diziye aktarıyorum.Birden çok API isteğinden global diziye geçin

Benim Kod şu anda şöyle görünür:

Sayfa 1

{ 
    "count": 105, 
    "next": "http://url.com/api/v1/cities/?page=2", 
    "previous": null, 
    "results": [ 
     { 
      "city_name": "Paris" 
     }, 
     { 
      "city_name": "Brussels" 
     } 
    ] 
} 

Sayfa 2

: Ben şuna benzer JSON iki sayfa var varsayarsak

var results = []; 
function nextPage(url) { 
    if (!url) { 
     return; 
    } 
    $.getJSON(url, function(data) { 
     nextPage(data.next); 
     $.each(data.results, function (k, v) { 
      results.push(v.city_name); 
     }); 
    }); 
} 

nextPage('http://url.com/api/v1/cities/?page=1'); 
console.log(results); 

{ 
    "count": 105, 
    "next": null, 
    "previous": "http://url.com/api/v1/cities/?page=1", 
    "results": [ 
     { 
      "city_name": "Manchester" 
     }, 
     { 
      "city_name": "Curitiba" 
     } 
    ] 
} 

Ben dizi şöyle arayacakları: Ben konsola results oturum açtığınızda

["Paris", "Brussels", "Manchester", "Curitiba"] 

Ancak, dizi boştur. Biri yardım edebilir mi? Daha fazla bilgiye ihtiyacın olursa haberim olsun.

+0

Doğru görünüyor. Console.log() 'ı ikinci bir sonraki çağrıya (nextPage()) göndermeden hemen önce deneyin, belki de cevap beklediğiniz gibi değildir. –

+1

nextPage eşzamansızdır - herhangi bir veriyi almayı ve bunu global sonuç dizisinde saklamayı denemeden önce console.log adresi çağrılır. – thewatcheruatu

+0

Javascript çağrısı bitmeden önce 'results' dizi verilerine erişmeye çalışıyorsunuz. $ .each() 'içindeki console.log() 'unuzu yerleştirmeyi deneyin. Verilerinizin "results" dizisinde doğru bir şekilde girildiğini göreceğinize eminim. –

cevap

1

Bunu jQuery vaat kullanarak bunu öneririm nasıl Diğer kodda kullanılacak işlev. Ayrıca bir hata işleme yolu da sağlar.

GetCities işlevi ilk URL'yi alır ve ardından sonuç dizisi yerine getirilen değer olarak çözümlenecek bir söz verir.

Dahili nextPage() işlevi, sonraki URL'yi alır. Sonuçlara ulaştığı url'yi test ediyorum ve daha sonra, bir sonraki sözünü orijinaline zincirleyen ya da nihai sonucu, sözün nihai yerine getirdiği değer olarak veren bir url üzerinde tekrar çağırıyorum.

+0

@ sammy88888888 - Lütfen eşzamanlı olmayan işlemleri sıralamak ve hataları işlemek ve yaymak için verilen sözleri kullanmayı öğrenmeyi düşünün. ES6'da standartlaştırılmıştır ve asenkron kod yazmanın modern yoludur. Sorunuzdaki yaklaşımınız ve kabul ettiğiniz cevap, verileri işlevinizden çıkarmanıza izin vermez ve her ikisi de sözler düzgün bir şekilde kullanıldığında pratik olarak ücretsiz gelir. – jfriend00

+0

Cevabınızı uygulamaya çalıştım ancak sonuçların yalnızca ilk sayfasının döndürülmesiyle sonuçlandı. Bir şey mi eksik? – sammy88888888

+0

@ sammy88888888 - Kodu doğru değildim, ancak şimdi düzeltdim ve basitleştirdim. Burada bir simülasyon inşa ettim: https://jsfiddle.net/jfriend00/s1hhxztv/ tüm bunların çalıştığını doğrulamak için. Bu yaklaşım, onu çağırmak için kullanabileceğiniz güzel ve temiz bir arayüz sağlar. – jfriend00

1

Yorumlarda belirtildiği gibi, console.log isteklerin tamamlanmasından önce yürütülür. Bunun yerine böyle bir şey yapmak ister ki: Bu veriyor

function getCities(initialUrl) { 
    var results = []; 

    function nextPage(url) { 
     return $.ajax(url, {method: "POST", data: {json: src[cntr++]}}).then(function(data) { 
      $.each(data.results, function (k, v) { 
       results.push(v.city_name); 
      }); 
      if (data.next) { 
       return nextPage(data.next); 
      } else { 
       return results; 
      } 
     }); 
    } 

    return nextPage(initialUrl); 
} 

getCities('http://url.com/api/v1/cities/?page=1').then(function(results) { 
    console.log(results); 
}, function(err) { 
    // handle error here 
}); 

Eğer fonksiyon daha sonra arayıp sonra dışarı veri almak için:

İşte
var results = []; 
function nextPage(url) { 
    if (!url) { 
     return; 
    } 
    $.getJSON(url, function(data) { 
     $.each(data.results, function (k, v) { 
      results.push(v.city_name); 
     }); 
     if(data.next){ 
      // There is a next page, continue: 
      nextPage(data.next); 
     }else{ 
      // You're done: 
      console.log(results); 
     } 
    }); 
} 

nextPage('http://url.com/api/v1/cities/?page=1'); 
+0

Tam olarak aradığım şey bu, teşekkürler! – sammy88888888

İlgili konular