2017-05-18 13 views
0

私はプロジェクトの所有者IDとプロジェクトのタイトルを含む 'projects'の配列を持っています。AJAXはinsideループを要求します:前の呼び出しの応答に基づいて特定のajax呼び出しを中止しますか?

「プロジェクト」配列をループし、AJAXを使って各プロジェクトの「所有者ID」を渡すことで、各プロジェクトの所有者名を取得したいと考えています。

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); 
    }); 


}); 

私は繰り返しは、「IDの1による最初のプロジェクト」だったとき、私はデータを得ているだろうので、プロジェクトの反復は「IDの一つ目のプロジェクト」であるとき、Ajaxの機能を呼び出していない/中止します。言うことです

私が欲しいの出力には、この(アリス、ボブとチャーリーは、それぞれで、1,2,3をOWNER_ID仮定):

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 

しかし、その代わりに、私はこのを得ました:

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 

asynchronousityを維持しながら、どのように私はAJAXで( "非同期= false" に使用せずに)これを達成できますか?

答えて

1

あなたが探しているのはPromise.raceです。しかし、あなたが求めていることをするには、まずオーナーIDでデータをグループ化し、Promise.raceに渡す必要があります。これは、複数のプロジェクトを持つすべての所有者に対して行います。

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

$.whenPromise.allためのjQueryの同等であるが、Promise.raceためのjQueryの同等物が存在しないことに留意されたいです。また、他の約束を中止することはありませんが、最初に解決/拒否する約束の価値で解決し、残りは無視します。

+0

それだけです。ありがとう –

関連する問題