Как ждать функцию «Массив для каждой»? - PullRequest
1 голос
/ 11 октября 2019

У меня возникла небольшая проблема с синхронной / асинхронной системой в функции "Array.foreach". Я не знаю, как заставить мой код ждать его завершения.

Я пытался использовать систему await / async, но мой код не ожидал код в "async responseDB =>".

Это мой класс:

...
        let responsesDTO = [];
        await Array.prototype.forEach.call(await searchResponsesByQuestionAndUserId(questions[cpt].idquestion, idUser), async responseDB => {
            if(responseDB !== undefined){
                const responseDTO = {
                    response_id:0,
                    response_text:"",
                    response_type:""
                }
                const responseEntity = await searchResponseByResponseId(responseDB.response_id);
                responseDTO.response_id = responseDB.response_id;
                responseDTO.response_text= responseEntity.text;
                responseDTO.response_type= responseDB.type;
                responsesDTO.push(responseDTO);
            }
        });
        questionResponse.responses=responsesDTO;
        questionResponses[cpt]=questionResponse;
    }

Не могли бы вы помочь мне, пожалуйста? Заранее спасибо.

1 Ответ

0 голосов
/ 11 октября 2019

Мне пришлось высмеивать ваши асинхронные функции. Однако соответствующая часть должна использовать for..of вместо forEach

async function searchResponsesByQuestionAndUserId() {
  let responsesDB = [];
  for (let i = 0; i < 10; i++) {
    responsesDB.push({
      response_id: parseInt(1000 * Math.random(), 10),
      type: 'whatever ' + i
    });
  }
  return new Promise((res) => {
    window.setTimeout(() => {
      res(responsesDB);
    }, 1500);
  });

}
async function searchResponseByResponseId(response_id) {
  return new Promise((res) => {
    window.setTimeout(() => {
      res({
        text: 'text for response ' + response_id
      });
    }, 300);
  });
}
async function getResponsesDTO() {
  let responsesDTO = [],
    responsesDB = await searchResponsesByQuestionAndUserId();
  for (let responseDB of responsesDB) {
    if (responseDB === undefined) {
      continue;
    }


    let responseDTO = {
        response_id: 0,
        response_text: "",
        response_type: ""
      },
      responseEntity = await searchResponseByResponseId(responseDB.response_id);
    responseDTO.response_id = responseDB.response_id;
    responseDTO.response_text = responseEntity.text;
    responseDTO.response_type = responseDB.type;
    responsesDTO.push(responseDTO);
    console.log({responseDTO});

  }

  return responsesDTO;
}

getResponsesDTO().then(responsesDTO => {
  console.log(responsesDTO);
});
...