2017-05-18 1 views
0

Ich habe eine Reihe von "Projekten", die die ID des Projekteigentümers und den Titel des Projekts enthalten.AJAX-Anfragen innerhalb der Schleife: Abbruch bestimmter Ajax-Anrufe basierend auf der Antwort des vorherigen Anrufs?

Ich möchte den Namen jedes Projektbesitzers abrufen, indem ich das Array 'projects' durchlaufen und einen Anforderungsaufruf machen, indem ich die Besitzer-ID jedes Projekts an einen Server mit AJAX übergebe.

var projects = [ 
    {owner_id: 1, title: "First project by id one"}, 
    {owner_id: 2, title: "First project by id two"}, 
    {owner_id: 1, title: "Second project by id one"}, 
    {owner_id: 3, title: "First project by id three"} 
]; 

//iterate through the 'projects' array to get the project's owner_id its respective owner_name 
var owner_names = {}; 
projects.forEach(function(project) { 
    //check if the id exist in the owner_names key-value pair 
    if (project.owner_id in owner_names) { 
     //go the next iteration because we already know the owner name 
     return; 
    } 

    //get username by id 
    $.ajax({ 
     url: '//some.com/get/owner_name/by/id/', 
     data: project.owner_id 
    }.then(function(data) { 
     owner_names[data.id] = data.name; 
     console.log("First project by " + data.name + " is " + project.title); 
    }); 


}); 

Ich will/nicht abbrechen die Ajax-Funktion aufgerufen wird, wenn das Projekt Iteration der „Zweiten Projekt-ID eine“ ist, weil ich die Daten bekommen hätte, wenn die Iteration „Erstes Projekt von id one“ ist.

Das heißt, ich ausgeben wollen diese (nehmen owner_id 1,2,3, ist Alice, Bob und Charlie respectively):

First project by Alice is First project by id one 
First project by Bob is First project by id two 
First project by Charlie is First project by id three 

Aber stattdessen Ich habe diese:

First project by Alice is First project by id one 
First project by Bob is First project by id two 
First project by Alice is Second project by id one 
First project by Charlie is First project by id three 

Wie kann ich dies erreichen, während die asynchronousity Aufrechterhaltung (ohne "async = false" verwendet wird) in AJAX?

Antwort

1

Was Sie suchen, ist Promise.race. Um jedoch das zu tun, was Sie fragen, müssen Sie die Daten zuerst nach Besitzer-ID gruppieren und an Promise.race übergeben. Tun Sie dies für jeden Besitzer, der mehrere Projekte hat.

// Something like... 
Promise.all([ 
    Promise.race([ owner1project1ajax, owner1project2ajax ]), 
    owner2project1ajax, 
    owner3project1ajax, 
]) 

Beachten Sie, dass während $.when ist die jQuery-Äquivalent für Promise.all, gibt es keine jQuery Äquivalent für Promise.race. Auch wird es die anderen Versprechen nicht abbrechen, sondern wird mit dem Wert des Versprechens, das zuerst verrechnet/ablehnt, den Rest ignorieren.

+0

Das ist es. Vielen Dank –

Verwandte Themen