Javascript 这个承诺有什么问题?所有的解决方案

Javascript 这个承诺有什么问题?所有的解决方案,javascript,drop-down-menu,promise,es6-promise,Javascript,Drop Down Menu,Promise,Es6 Promise,我需要遍历一个项目数组,并检查每个项目的类型是否与所需的类型匹配。完成所有检查后,将符合要求的项添加到下拉选择框中。在一个数组中,如果有两个项满足要求,则此代码检查是否始终只将第一个项添加到下拉列表中,这有什么问题 var promises = []; var html = ""; for (var i = 0; i < items.length; i++) { var promise = new Promise(function(resolve, reject){ $.aj

我需要遍历一个项目数组,并检查每个项目的类型是否与所需的类型匹配。完成所有检查后,将符合要求的项添加到下拉选择框中。在一个数组中,如果有两个项满足要求,则此代码检查是否始终只将第一个项添加到下拉列表中,这有什么问题

var promises = [];
var html = "";

for (var i = 0; i < items.length; i++) {
  var promise = new Promise(function(resolve, reject){
    $.ajax({
      url: "url" + items[i], 
      dataType: "json",
      success: function (data) {
        console.log(data); 
        console.log(data.type); // "mytype"
        console.log(typeof data.type); // string
        if(data.type == "mytype") {
          html += "<option value='" + data.id + "'>" + items[i] + "</option>";
          resolve();
        }
      }
    });
  promises.push(promise); 
  });
}

console.log(promises) // (2) [undefined, Promise]

Promise.all(promises).then(() => {
  $("#dropdownBox").html(html);
});


并相应地修改了循环中的内容,但没有运气。这篇文章()对我没有帮助

您遇到的问题之一是,如果类型不满足条件,则无法解决承诺

您的
for()

由于
$.ajax
返回了一个承诺,因此这里有一种使用map()创建闭包和承诺数组的反模式方法

// map array of promises
var promises = items.map((item) => {
  // return $.ajax promise
  return $.ajax({
    url: "url" + item,
    dataType: "json"
  }).then((data) => {
    let html = '';
    if (data.type == "mytype") {
      html += "<option value='" + data.id + "'>" + item + "</option>";
    }
    return html;
  });
});

Promise.all(promises).then((res) => {
  // res is array of  html (or empty) strings returned in each then() above
  $("#dropdownBox").html(res.join(''));
}).catch(err => console.log('At least one request failed'));
//映射承诺数组
var promises=items.map((item)=>{
//返回$.ajax承诺
返回$.ajax({
url:“url”+项目,
数据类型:“json”
})。然后((数据)=>{
让html='';
如果(data.type==“mytype”){
html+=“”+项目+“”;
}
返回html;
});
});
承诺。所有(承诺)。然后((res)=>{
//res是在上述每个then()中返回的html(或空)字符串数组
$(“#下拉框”).html(res.join(“”));
}).catch(err=>console.log(“至少一个请求失败”);

您遇到的问题之一是,如果类型不满足条件,则无法解决承诺

您的
for()

由于
$.ajax
返回了一个承诺,因此这里有一种使用map()创建闭包和承诺数组的反模式方法

// map array of promises
var promises = items.map((item) => {
  // return $.ajax promise
  return $.ajax({
    url: "url" + item,
    dataType: "json"
  }).then((data) => {
    let html = '';
    if (data.type == "mytype") {
      html += "<option value='" + data.id + "'>" + item + "</option>";
    }
    return html;
  });
});

Promise.all(promises).then((res) => {
  // res is array of  html (or empty) strings returned in each then() above
  $("#dropdownBox").html(res.join(''));
}).catch(err => console.log('At least one request failed'));
//映射承诺数组
var promises=items.map((item)=>{
//返回$.ajax承诺
返回$.ajax({
url:“url”+项目,
数据类型:“json”
})。然后((数据)=>{
让html='';
如果(data.type==“mytype”){
html+=“”+项目+“”;
}
返回html;
});
});
承诺。所有(承诺)。然后((res)=>{
//res是在上述每个then()中返回的html(或空)字符串数组
$(“#下拉框”).html(res.join(“”));
}).catch(err=>console.log(“至少一个请求失败”);

使用
$。每个
而不是
for()
循环创建一个closure@charlietfl我不明白这会有什么帮助?因为我尝试了
items.forEach(函数(项目)){…
并相应地更改了循环中的内容,当我记录promises数组时,它的
未定义out@charlietfl请参阅更新的问题显示每个回答的结果。如果不使用
$,很难提供帮助。每个
而不是
for()
循环以创建一个closure@charlietfl我不明白这会有什么帮助?因为我尝试了
items.forEach(函数(项目)){…
并相应地更改了循环中的内容,当我记录promises数组时,它的
未定义out@charlietfl请参阅更新的问题显示您从每个回答中得到的信息。如果没有答案,很难帮助您使用您提到的
每个
方法是否有办法做到这一点确保…像您刚才所做的那样创建数组,然后将每个
$.ajax
promise推入该数组。将
映射
切换为
每个
是否有办法使用您提到的
每个
方法进行此操作当然……像您刚才那样创建数组,并将每个
$.ajax
promise推入该数组。将
映射
切换为
每个
// map array of promises
var promises = items.map((item) => {
  // return $.ajax promise
  return $.ajax({
    url: "url" + item,
    dataType: "json"
  }).then((data) => {
    let html = '';
    if (data.type == "mytype") {
      html += "<option value='" + data.id + "'>" + item + "</option>";
    }
    return html;
  });
});

Promise.all(promises).then((res) => {
  // res is array of  html (or empty) strings returned in each then() above
  $("#dropdownBox").html(res.join(''));
}).catch(err => console.log('At least one request failed'));