nodejs의 비동기 교체기

앞말


노드에서.jsv10.0.0부터 비동기 교체기가 등장했는데 최근 지역사회에서의 흡인력이 점점 커지고 있다.본고에서 우리는 비동기 교체기의 작용을 토론하고 그것들이 어떤 목적에 사용될 수 있는지의 문제를 해결할 것이다.

무엇이 비동기 교체기입니까


그렇다면 비동기 교체기는 무엇입니까?그것들은 실제로 이전에 사용할 수 있었던 교체기의 비동기적인 버전이다.교체된 값과 최종 상태를 알 수 없을 때, 비동기 교체기를 사용할 수 있으며, 최종적으로 {value:any,done:boolean} 대상을 해결할 수 있는promise를 얻을 수 있습니다.우리는 또한 비동기 교체기를 순환하는 데 도움을 주기 위해 for-await-of 순환을 얻었다.for-of 순환이 동기화 교체기를 겨냥한 것처럼.

const asyncIterable = [1, 2, 3];
asyncIterable[Symbol.asyncIterator] = async function*() {
  for (let i = 0; i < asyncIterable.length; i++) {
    yield { value: asyncIterable[i], done: false }
  }
  yield { done: true };
};

(async function() {
  for await (const part of asyncIterable) {
    console.log(part);
  }
})();
일반적인 for-of 순환과 반대로 for-await-of 순환은 받은 모든promise 해석을 기다린 후 다음 순환을 계속합니다.
흐름을 제외하고는 현재 비동기적인 교체를 지원하는 구조는 많지 않지만, 교체할 수 있는 구조에 기호를 수동으로 추가할 수 있다.

비동기 교체기로 흐르다


비동기 교체기는 흐름을 처리할 때 매우 유용하다.읽을 수 있는 흐름, 쓸 수 있는 흐름, 이중 작업 흐름과 변환 흐름은 모두 비동기 교체기를 지원한다.

async function printFileToConsole(path) {
  try {
    const readStream = fs.createReadStream(path, { encoding: 'utf-8' });

    for await (const chunk of readStream) {
      console.log(chunk);
    }

    console.log('EOF');
  } catch(error) {
    console.log(error);
  }
}
만약 이런 방식으로 코드를 작성한다면, 모든 데이터 블록을 교체해서 가져올 때 데이터와end 이벤트를 감청할 필요가 없고, for-await-of 순환은 흐름 자체가 끝날 때 끝난다.

페이지 나누기 기능이 있는 API 호출


페이지를 나누는 원본에서 데이터를 쉽게 얻을 수 있도록 비동기적으로 교체할 수도 있다.이를 위해, 우리는 Node https 요청 방법에서 우리의 흐름에서 응답 주체를 재구성하는 방법을 제공해야 한다.https 요청과 응답은 Node의 흐름이기 때문에 비동기 교체기를 사용할 수도 있습니다.

const https = require('https');

function homebrewFetch(url) {
  return new Promise(async (resolve, reject) => {
    const req = https.get(url, async function(res) {
      if (res.statusCode >= 400) {
        return reject(new Error(`HTTP Status: ${res.statusCode}`));
      }

      try {
        let body = '';

        /*
            res.on  ,
            for-await-of,  data chunk
           
        */
        for await (const chunk of res) {
          body += chunk;
        }
    
        //   body  
        if (!body) resolve({});
        //   json, 
        const result = JSON.parse(body);
        resolve(result);
      } catch(error) {
        reject(error)
      }
    });

    await req;
    req.end();
  });
}
우리는 고양이 그림을 10장 한 조로 얻을 수 있도록 Cat API에 요청할 것이다.cat API 과부하를 피하기 위해 요청 사이에 최대 페이지 수가 5인 7초의 지연을 추가합니다.
고양이cat API의 재부팅을 피하기 위해 요청과 최대 페이지 수 사이에 7초 지연을 추가합니다. 재난적이기 때문입니다.

function fetchCatPics({ limit, page, done }) {
  return homebrewFetch(`https://api.thecatapi.com/v1/images/search?limit=${limit}&page=${page}&order=DESC`)
    .then(body => ({ value: body, done }));
}

function catPics({ limit }) {
  return {
    [Symbol.asyncIterator]: async function*() {
      let currentPage = 0;
      // Stop after 5 pages
      while(currentPage < 5) {
        try {
          const cats = await fetchCatPics({ currentPage, limit, done: false });
          console.log(`Fetched ${limit} cats`);
          yield cats;
          currentPage ++;
        } catch(error) {
          console.log('There has been an error fetching all the cats!');
          console.log(error);
        }
      }
    }
  };
}

(async function() {
  try {
    for await (let catPicPage of catPics({ limit: 10 })) {
      console.log(catPicPage);
      // Wait for 7 seconds between requests
      await new Promise(resolve => setTimeout(resolve, 7000));
    }
  } catch(error) {
    console.log(error);
  }
})()
이렇게 하면 우리는 7초 간격으로 고양이 사진 한 페이지를 자동으로 되찾아 감상할 수 있다.
더 흔히 볼 수 있는 페이지 사이를 내비게이션하는 방법은next와previous 방법을 실현하고 이를 컨트롤로 공개하는 것이다.

function actualCatPics({ limit }) {
  return {
    [Symbol.asyncIterator]: () => {
      let page = 0;
      return {
        next: function() {
          page++;
          return fetchCatPics({ page, limit, done: false });
        },
        previous: function() {
          if (page > 0) {
            page--;
            return fetchCatPics({ page, limit, done: false });
          }
          return fetchCatPics({ page: 0, limit, done: true });
        }
      }
    }
  };
}

try {
    const someCatPics = actualCatPics({ limit: 5 });
    const { next, previous } = someCatPics[Symbol.asyncIterator]();
    next().then(console.log);
    next().then(console.log);
    previous().then(console.log);
} catch(error) {
  console.log(error);
}
보시다시피 데이터 페이지를 가져오거나 응용 프로그램의 UI에서 무한 스크롤을 할 때 비동기 교체기가 매우 유용할 것입니다.
이러한 기능은 브라우저에서 한동안 사용되었으며 Chrome v63+, Firefox v57+ 및 Safari v11.1에서 사용할 수 있습니다.그러나 현재 IE 및 Edge에서는 사용할 수 없습니다.
이상은 nodejs의 비동기 교체기에 대한 상세한 내용입니다. 더 많은 nodejs 비동기 교체기에 대한 자료는 저희 다른 관련 글을 주목해 주십시오!

좋은 웹페이지 즐겨찾기