node.js 여러 비동기 과정 에서 실행 여 부 를 판단 하 는 솔 루 션

머리말
본 고 는 주로 node.js 의 여러 비동기 과정 에서 집행 의 완성 여 부 를 판단 하 는 데 관 한 내용 을 소개 하 였 으 며,이렇게 말 하면 여러분 들 이 잘 모 르 실 수도 있 습 니 다.다음은 상세 한 소 개 를 살 펴 보 겠 습 니 다.
필드:
요 구 량 이 비교적 많은 네트워크 데 이 터 를 얻 고 싶 습 니 다.예 를 들 어 1000 개의 결 과 를 얻 으 려 고 하지만 데이터 처리 속도 가 느 리 고 시간 초과 위험 이 있 으 면 10 번 으로 나 누 어 처리 할 수 있 습 니 다.매번 에 100 개 를 처리 할 수 있 습 니 다.모든 요청 이 완 료 된 후에 통일 적 으로 처리 합 니 다.
이러한 응용 장면 은 이렇게 처리 할 수 있다.
프로젝트 1:요청 한 데이터 항목 판단

//       
function fetch(url, callback) {
 setTimeout(function (){
 callback(null, {
  subjects: [{
   data: Math.round(Math.random() * 100)
  }]
  });
 }, 2000);
}
//     1
function multiTask_1 () {
 var arr = [];
 var baseUrl = 'https://api.douban.com/v2/movie/top250';
 for (var start = 0; start < 10; start++) {
 var url = baseUrl + '?start=' + start + "&count=1";
  fetch(url, function(error, res) {
  var data = res.subjects;
  arr = arr.concat(data);
  //          
  if (arr.length === 10) {
   console.log(arr);
  }
 });
 }
}
실행 결 과 를arr.length로 판단 합 니 다.만약arr.length우리 가 기대 하 는 것 처럼 네트워크 전송 이나 처리 이상 으로 인해 하나 가 적 으 면 우 리 는 후속 적 인 처 리 를 할 수 없습니다.이런 처리 방식 은 업무 결합 이 강하 다.보편성 이 없다.
방안 2:비동기 프로 세 스 실행 횟수 판단

//   2
function multiTask_2 () {
 var taskWatcher = 0;
 var arr = [];
 var baseUrl = 'https://api.douban.com/v2/movie/top250';
 for (var start = 0; start < 10; start++) {
 taskWatcher++;
 var url = baseUrl + '?start=' + start + "&count=1";
 fetch(url, function(error, res) {
  var data = res.subjects;
  arr = arr.concat(data);
  taskWatcher--;
  if (taskWatcher === 0) {
   console.log(arr);
  }
 });
 }
}
방안 2 의 판단 조건 은 이곳 의 taskWatcher 가 비동기 임무 수행 상황 의 관찰자 역할 을 하고 비동기 과정의 호출 횟수 와 관련 이 있 으 며 다른 처리 과정 과 무관 하 다.그럼 다른 방안 은 없 나 요?
프로젝트 3:Promise.all()Promise.all(iterable) 방법 은 Promise 를 되 돌려 줍 니 다.상기 교체 가능 한 대상 중의 모든 Promise 가 resolve 된 후에 resolve 되 거나 어떤 Promise 가 reject 된 후에 reject 됩 니 다.

function multiTask_3 () {
 // var taskWatcher = 0;
 var taskStack = [];
 var arr = [];
 var baseUrl = 'https://api.douban.com/v2/movie/top250';
 for (var start = 0; start < 10; start++) {
 taskStack.push(
  new Promise((resolve, reject) => {
  var url = baseUrl + '?start=' + start + "&count=1";
  fetch(url, function(error, res) {
   var data = res.subjects;
   arr = arr.concat(data);
   resolve();
  });
  })
 );
 }
 Promise.all(taskStack).then(function () {
 console.log(arr);
 });
}
이런 방식 은 더욱 통용 성 이 있 기 때문에 비동기 임무 의 유형 이 다 르 면 이런 방식 으로 해결 할 수 있다.그러나 reject 의 처리 에 주의해 야 한다.최종 처리 에 미 치 는 영향 을 피하 다.
프로젝트 4:EventProxy
EventProxy 는 박 령 이 쓴 것 이다.https://github.com/JacksonTian/eventproxy

 var ep = new EventProxy();
 var arr = [];
 ep.after('fetchData', 10, function (list) {
 list.forEach(function(item){
  arr = arr.concat(item); 
 });
 console.log(arr);
 });
 var baseUrl = 'https://api.douban.com/v2/movie/top250';
 for (var start = 0; start < 10; start++) {
 var url = baseUrl + '?start=' + start + "&count=1";
  fetch(url, function(error, res) {
  var data = res.subjects;
  ep.emit('fetchData', data);
 });
 }
EventProxy 는 이벤트 구독/발표 모드 를 기반 으로 이곳 의 after 방법 은 여러 번 의 사건 을 조사 할 수 있 고 여러 번 의 비동기 작업 의 데이터 결 과 를 저장 한 배열 입 니 다.이 밖 에 EventProxy 는 여러 사건 의 수사 와 처 리 를 지원 합 니 다.
총결산
이상 은 이 글 의 전체 내용 입 니 다.본 논문 의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 참고 학습 가치 가 있 기 를 바 랍 니 다.궁금 한 점 이 있 으 시 면 댓 글 을 남 겨 주 셔 서 저희 에 대한 지지 에 감 사 드 립 니 다.

좋은 웹페이지 즐겨찾기