>source

API에서 데이터를 가져 와서 mongodb 데이터베이스에 저장하는 코드를 작성 중입니다. 내가 작성한 코드는 다음과 같습니다.

    getSquadList: async (ctx) => {
var query = ctx.request.query;
var squadList = await getSquadsOfMatch(query.matchId);
if (squadList.length <= 1) {
  var response = await axios.get(
    `${strapi.config.currentEnvironment.getSquadListApi}?apikey=${strapi.config.currentEnvironment.cricApiKey}&unique_id=${query.matchId}`
  );
  squadList = response.data.squad;
  var match = await Match.findOne({
    unique_id: query.matchId
  });
  var team1Squad, team2Squad;
  await squadList.forEach(async squad => {
    if (squad.name === match['team-1']) {
      team1Squad = {
        name: match['team-1'],
        match_id: match['unique_id'],
        match: match['_id'],
      };
      await new Squad(team1Squad).save();
      console.log('1');
    } else if (squad.name === match['team-2']) {
      team2Squad = {
        name: match['team-2'],
        match_id: match['unique_id'],
        match: match['_id'],
      };
      await new Squad(team2Squad).save();
      console.log('2');
    }
  });
  squadList = await getSquadsOfMatch(query.matchId);
  console.log('3');
}
ctx.send(squadList);
      }

console.log ()를 사용하여 실행 순서를 확인했습니다. 내가 원하는 순서는 1 2 3이지만 실제 출력은 3 1 2입니다. 프로그램이 마지막에 이러한 행을 실행하도록하려면 어떻게해야합니까?         squadList = 대기 getSquadsOfMatch (query.matchId);           console.log ( '3');

  • 답변 # 1

    async 를 사용할 수 없습니다   forEach 기능  우리가 무엇 forEach 를 모방하면  그것이 될 것인가 :

    function forEach(arr, callback){
       for(let i=0;i<arr.length;i++){
            callback(arr[i], i, arr);
       }
    }
    
    

    보시다시피, await 하지 않습니다  당신의 async  콜백.

    사용자 정의 forEach 를 만들 수 있습니다  처럼 :

    async function forEach(arr, callback){
       for(let i=0;i<arr.length;i++){
            await callback(arr[i], i, arr);
       }
    }
    
    

    또는 간단한 for 사용  루프.

    또한, 약속을 모두 배열로 푸시하고 Promise.all 를 호출하면됩니다.  모든 요청을 처리합니다.

    async (ctx) => {
        var query = ctx.request.query;
        var squadList = await getSquadsOfMatch(query.matchId);
        if (squadList.length <= 1) {
            var response = await axios.get(
                `${strapi.config.currentEnvironment.getSquadListApi}?apikey=${strapi.config.currentEnvironment.cricApiKey}&unique_id=${query.matchId}`
            );
            squadList = response.data.squad;
            var match = await Match.findOne({
                unique_id: query.matchId
            });
            var team1Squad, team2Squad;
            const promises = squadList.map(squad => {
                if (squad.name === match['team-1']) {
                    team1Squad = {
                        name: match['team-1'],
                        match_id: match['unique_id'],
                        match: match['_id'],
                    };
                    console.log('1');
                    return new Squad(team1Squad).save(); //returning the promise
                } else if (squad.name === match['team-2']) {
                    team2Squad = {
                        name: match['team-2'],
                        match_id: match['unique_id'],
                        match: match['_id'],
                    };
                    console.log('2');
                    return new Squad(team2Squad).save(); //returning the promise
                }
            });
            await Promise.all(promises); //making all the changes parallely
            squadList = await getSquadsOfMatch(query.matchId);
            console.log('3');
        }
        ctx.send(squadList);
    }
    
    

    참고 :루프와 비동기 기능을 다루는 기사를 하나 만들었습니다. https://medium.com/trappedpanda/loops-asynchronous-functions-and-returning -collective-results-in-node-js-b7566285fb74

  • 답변 # 2

    먼저 실행해야하는 약속 배열을 작성하고 Promise.all 를 사용하여 해결 될 때까지 기다려야합니다.   getSquadsOfMatch 를 실행하기 전에 :

    getSquadList: async (ctx) => {
        var query = ctx.request.query;
        var squadList = await getSquadsOfMatch(query.matchId);
        if (squadList.length <= 1) {
          var response = await axios.get(
            `${strapi.config.currentEnvironment.getSquadListApi}?apikey=${strapi.config.currentEnvironment.cricApiKey}&unique_id=${query.matchId}`
          );
          squadList = response.data.squad;
          var match = await Match.findOne({
            unique_id: query.matchId
          });
          var team1Squad, team2Squad;
          const tasks = squadList.map(async squad => {
            if (squad.name === match['team-1']) {
              team1Squad = {
                name: match['team-1'],
                match_id: match['unique_id'],
                match: match['_id'],
              };
              await new Squad(team1Squad).save();
              console.log('1');
            } else if (squad.name === match['team-2']) {
              team2Squad = {
                name: match['team-2'],
                match_id: match['unique_id'],
                match: match['_id'],
              };
              await new Squad(team2Squad).save();
              console.log('2');
            }
          });
          await Promise.all(tasks)
          squadList = await getSquadsOfMatch(query.matchId);
          console.log('3');
        }
        ctx.send(squadList);
      }
    
    

  • 이전 javascript - vuex에서 마운트 된 기능으로 상점 데이터에 액세스하는 방법
  • 다음 oracle - sql - 하나의 레코드에 특정 값이있는 경우 해당 값만 얻으십시오