Javascript 如何仅在“时”设置状态;“地图”;循环结束了吗?

Javascript 如何仅在“时”设置状态;“地图”;循环结束了吗?,javascript,reactjs,asynchronous,promise,setstate,Javascript,Reactjs,Asynchronous,Promise,Setstate,我发送了一些http请求,在承诺解决之后,我需要在数组中循环并执行一些异步操作。我想让函数保持异步,但我只需要在“映射”循环完成后执行setState: fetchData = () => { let data = []; let tickets = http.get('/api/zendesk/tickets'), users = http.get('/api/zendesk/users'), items = http.get('/api/order

我发送了一些http请求,在承诺解决之后,我需要在数组中循环并执行一些异步操作。我想让函数保持异步,但我只需要在“映射”循环完成后执行setState:

fetchData = () => {
 let data = [];
 let tickets  = http.get('/api/zendesk/tickets'),
     users    = http.get('/api/zendesk/users'),
     items    = http.get('/api/orders/items'),
     reqTypes = http.get("/api/support/requests");

 Promise.all([users,tickets,items,reqTypes])
  .then(values => {
    console.log(values);
    let usersArr = values[0].data.users,
      ticketsArr = values[1].data.tickets,
        itemsArr = values[2].data,
      requestArr = values[3].data;

    data = ticketsArr.map((ticket,key) => {

      let id = ticket.custom_fields.find(field => field.id === productions_fields.order_id || field.id === develop_fields.order_id).value;

      id === null ? ticket.Items = [] : ticket.Items = itemsArr.filter(item => item.order_id === parseInt(id));

      ticket.Requests = requestArr.filter(request => request.id === ticket.id);
    })

    this.setState({tickets:data})

  }).catch(err => console.log(err))
 }
是否可以这样做,或者我需要像“for”一样进行同步循环

我得到一个“未定义对象”数组,为什么

因为您不返回地图主体内部的任何内容,并且默认情况下,它返回
未定义的

data = ticketsArr.map((ticket,key) => {
  let id = ticket.custom_fields.find(field => field.id === productions_fields.order_id || field.id === develop_fields.order_id).value;
  id === null ? ticket.Items = [] : ticket.Items = itemsArr.filter(item => item.order_id === parseInt(id));
  ticket.Requests = requestArr.filter(request => request.id === ticket.id);
  return ticket // <- this
})
检查此代码段:

a=[1,2,3,4].map(el=>{
log('el=',el);
})

log('a=',a)//未定义值的数组
array.prototype.map
希望您返回每个元素的最终形式。现在您没有返回任何内容,因此每个元素都成为未定义的

data = ticketsArr.map((ticket,key) => {
  let id = ticket.custom_fields.find(field => field.id === productions_fields.order_id || field.id === develop_fields.order_id).value;
  id === null ? ticket.Items = [] : ticket.Items = itemsArr.filter(item => item.order_id === parseInt(id));
  ticket.Requests = requestArr.filter(request => request.id === ticket.id);
  return ticket // <- this
})
data=ticketsArr.map((票证,钥匙)=>{
让id=ticket.custom_fields.find(field=>field.id==productions_fields.order_id | | field.id==developed_fields.order_id).value;
id==null?ticket.Items=[]:ticket.Items=itemsArr.filter(item=>item.order_id==parseInt(id));
ticket.Requests=requestArr.filter(request=>request.id==ticket.id);

返回票证//当前代码有什么问题?还有map中的哪个操作是异步的?我在打印状态时得到一个“未定义对象”数组…我认为“filter”方法是异步的,否?使用
forEach
检查解决方案,要修改现有数组,我们应该使用
forEach
而不是
map
:)很高兴它帮助了你:)