如何等待 "Array for each" 函数?

How wait a "Array for each" function?

我在 "Array.foreach" 函数中遇到 synchronous/asynchronous 系统的小问题。 我不知道如何强制我的代码等待结束。

我尝试使用 await/async 系统,但我的代码没有等待 "async responseDB =>" 中的代码。

这是我的 class:

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

你能帮帮我吗?提前致谢。

我不得不模拟你的异步函数。但是,相关部分是使用 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);
});