>  기사  >  웹 프론트엔드  >  node.js의 여러 비동기 프로세스 중에 실행이 완료되었는지 확인하는 방법(상세 튜토리얼)

node.js의 여러 비동기 프로세스 중에 실행이 완료되었는지 확인하는 방법(상세 튜토리얼)

亚连
亚连원래의
2018-06-21 17:17:571539검색

이 글에서는 node.js의 여러 비동기 프로세스에서 실행이 완료되었는지 판단하기 위한 여러 가지 솔루션을 주로 소개하며, 이를 필요로 하는 모든 사람의 학습이나 참고 학습 가치가 있는 샘플 코드를 통해 자세히 소개합니다. 와서 아래를 살펴볼 수 있습니다.

머리말

이 글에서는 node.js의 여러 비동기 프로세스에서 실행이 완료되었는지 판단하는 것과 관련된 내용을 주로 소개합니다. 자세한 소개.

시나리오:

대량의 네트워크 데이터를 요청하려는 경우, 예를 들어 1,000개의 결과를 얻고 싶지만 데이터 처리 속도가 느리고 시간 초과의 위험이 있는 경우 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 + &#39;?start=&#39; + 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를 사용하여 실행 결과를 판단합니다. code>arr.length는 우리가 예상한 것과 다릅니다. 예를 들어, 네트워크 전송 또는 처리 예외로 인해 하나가 누락되면 후속 처리를 수행할 수 없습니다. 이 처리 방법은 강력한 비즈니스 결합을 가지고 있지만 보편적이지 않습니다. arr.length来判断,如果arr.length不像我们期望的那样,比如由于网络传输或者处理异常,少一条,那么我们将无法做后续的处理。这种处理方式强业务耦合;不具有普适性。

方案二:判断异步过程执行次数

// 方案2
function multiTask_2 () {
 var taskWatcher = 0;
 var arr = [];
 var baseUrl = &#39;https://api.douban.com/v2/movie/top250&#39;;
 for (var start = 0; start < 10; start++) {
 taskWatcher++;
 var url = baseUrl + &#39;?start=&#39; + 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 充当异步任务执行情况的观察员,仅与异步过程的调用次数有关,且与其他处理过程无关。那有没有其他方案呢

方案三:Promise.all()

Promise.all(iterable)

옵션 2: 비동기 프로세스 실행 횟수 결정

function multiTask_3 () {
 // var taskWatcher = 0;
 var taskStack = [];
 var arr = [];
 var baseUrl = &#39;https://api.douban.com/v2/movie/top250&#39;;
 for (var start = 0; start < 10; start++) {
 taskStack.push(
  new Promise((resolve, reject) => {
  var url = baseUrl + &#39;?start=&#39; + 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);
 });
}
옵션 2의 판단 조건인 taskWatcher는 비동기 작업 실행의 관찰자 역할을 하며 비동기 프로세스이며 다른 처리 프로세스와 아무 관련이 없습니다. 다른 옵션이 있습니까? 옵션 3: Promise.all()

Promise.all(iterable) 메서드는 위에서 언급한 모든 반복 가능한 객체에 포함될 Promise를 반환합니다. 해결된 후에 해결되거나 약속이 거부된 후에 거부됩니다.

 var ep = new EventProxy();
 var arr = [];
 ep.after(&#39;fetchData&#39;, 10, function (list) {
 list.forEach(function(item){
  arr = arr.concat(item); 
 });
 console.log(arr);
 });
 var baseUrl = &#39;https://api.douban.com/v2/movie/top250&#39;;
 for (var start = 0; start < 10; start++) {
 var url = baseUrl + &#39;?start=&#39; + start + "&count=1";
  fetch(url, function(error, res) {
  var data = res.subjects;
  ep.emit(&#39;fetchData&#39;, data);
 });
 }

이 방법은 더 다양합니다. 비동기 작업 유형이 다른 경우에도 이 방법으로 해결할 수 있습니다. 그러나 거부 처리에 주의를 기울여야 합니다. 최종 처리에 미치는 영향을 피하십시오.

옵션 4: EventProxy

EventProxy는 Pu Ling이 작성했습니다. https://github.com/JacksonTian/eventproxy

rrreeeEventProxy는 이벤트 구독/게시 모델을 기반으로 하며 여기서는 after 메소드를 사용할 수 있습니다. 여러 번 수신 이벤트 및 콜백은 여러 비동기 작업의 데이터 결과 배열을 저장합니다. 또한 EventProxy는 여러 다른 이벤트의 수신 및 처리도 지원합니다.

위 내용은 모두를 위해 제가 정리한 내용입니다. 앞으로 모든 사람에게 도움이 되기를 바랍니다.

관련 기사:

vue-cli를 사용하여 인터페이스 프록시를 구성하는 방법

🎜양식 데이터 형식을 사용하여 NodeJs에서 파일을 전송하는 방법🎜🎜🎜🎜WeChat 애플릿에서 이미지 지연 로딩을 구현하는 방법🎜🎜🎜 🎜사용법 js에서 포커스 맵 효과를 얻는 방법🎜🎜

위 내용은 node.js의 여러 비동기 프로세스 중에 실행이 완료되었는지 확인하는 방법(상세 튜토리얼)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.