Javascript 循环内的AJAX请求:基于上一次调用的响应中止某些AJAX调用?

Javascript 循环内的AJAX请求:基于上一次调用的响应中止某些AJAX调用?,javascript,jquery,ajax,asynchronous,event-loop,Javascript,Jquery,Ajax,Asynchronous,Event Loop,我有一个包含项目所有者id和项目标题的“项目”数组 我希望通过循环“projects”数组,并进行请求调用,将每个项目的“owner id”传递给使用AJAX的服务器,从而获得每个项目的所有者名称 var projects = [ {owner_id: 1, title: "First project by id one"}, {owner_id: 2, title: "First project by id two"}, {owner_id: 1, title:

我有一个包含项目所有者id和项目标题的“项目”数组

我希望通过循环“projects”数组,并进行请求调用,将每个项目的“owner id”传递给使用AJAX的服务器,从而获得每个项目的所有者名称

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为one的第二个项目时,我想中止/不调用ajax函数,因为当迭代是id为one的第一个项目时,我会得到数据

也就是说,我想输出这个假设所有者id 1,2,3分别是Alice、Bob和Charlie:

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
但我得到的却是:


在维护异步性的同时,如何在AJAX中不使用async=false来实现这一点

你要找的是。但是,要执行您要求的操作,您需要首先按照所有者ID对数据进行分组,然后将其传递给Promise.race。为每个拥有多个项目的所有者执行此操作

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

请注意,虽然$when是Promise.all的jQuery等价物,但Promise.race没有jQuery等价物。此外,它不会中止其他承诺,但将首先解决/拒绝承诺的价值,忽略其余承诺。

就是这样。谢谢
// Something like...
Promise.all([
  Promise.race([ owner1project1ajax, owner1project2ajax ]),
  owner2project1ajax,
  owner3project1ajax,
])