2016-06-26 5 views
3

Ich muss eine Sequenz von fetch() machen Versprechen: Ich habe nur 1 URL zu einer Zeit, das bedeutet nur 1 fetch() versprechen. Jedes Mal, wenn ich einen JSON erhalte, enthält dieser eine URL für einen anderen JSON, also muss ich einen weiteren fetch() versprechen.mehrere, sequentielle fetch() Promise

Ich kann mit mehreren Versprechen arbeiten, aber in diesem Fall kann ich Promise.all() nicht tun, weil ich nicht die ganze URL, sondern nur eine.

Dieses Beispiel funktioniert nicht, es friert alles ein.

function fetchNextJson(json_url) 
{ 
    return fetch(json_url, { 
      method: 'get' 
     }) 
     .then(function(response) { 
      return response.json(); 
     }) 
     .then(function(json) { 
      console.log(json); 
      return json; 
     }) 
     .catch(function(err) { 
      console.log('error: ' + error); 
     }); 
} 


function getItems(next_json_url) 
{ 
    if (!(next_json_url)) return; 

    get_items = fetchNextJson(next_json_url); 

    interval = $q.when(get_items).then(function(response) { 
     console.log(response); 
     next_json_url = response.Pagination.NextPage.Href; 
    }); 

    getItems(next_json_url); 
} 


var next_json_url = 'http://localhost:3000/one'; 

getItems(next_json_url); 
+0

Was Verhalten und übergeordnete Ziel erwartet? – charlietfl

+0

Wie viele Gesamtanforderungen werden voraussichtlich verarbeitet? '$ q.when()' scheint nicht notwendig zu sein. Warum rufen Sie 'getItems (next_json_url)' außerhalb von '.then()' innerhalb von 'getItems()' call auf? – guest271314

+0

Was ist der Basisfall? Wann hörst du auf, Daten zu holen? –

Antwort

5

können Sie verwenden Rekursion

function fetchNextJson(json_url) { 
    return fetch(json_url, { 
      method: 'get' 
     }) 
     .then(function(response) { 
      return response.json(); 
     }) 
     .then(function(json) { 
      results.push(json); 
      return json.Pagination.NextPage.Href 
        ? fetchNextJson(json.Pagination.NextPage.Href) 
        : results 
     }) 
     .catch(function(err) { 
      console.log('error: ' + error); 
     }); 
} 


var next_json_url = 'http://localhost:3000/one'; 
var results = []; 

fetchNextJson(json_url).then(function(res) { 
    console.log(res) 
}) 
+0

Ich brauchte ein paar Minuten, um meinen Kopf einzuwickeln, warum das so gut funktioniert ... Die Schlussfolgerung fügt ständig 'then()' hinzu, bis schließlich ein Nichtversprechen zurückgegeben wird. Stimmt das nicht? – charlietfl

+0

@charlietfl Ja. Wenn 'json.Pagination.NextPage.Href' definiert ist, rufe' fetchNextJson' auf, sonst gib'result' Array zurück. – guest271314

+2

Vereinfachte Demo mit einem Counter anstatt mit einer neuen URL, um http://plnkr.co/edit/5boVimpYnoE1o41FXZGG zurückzugeben ? p = Vorschau – charlietfl