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 는 여러 사건 의 수사 와 처 리 를 지원 합 니 다.총결산
이상 은 이 글 의 전체 내용 입 니 다.본 논문 의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 참고 학습 가치 가 있 기 를 바 랍 니 다.궁금 한 점 이 있 으 시 면 댓 글 을 남 겨 주 셔 서 저희 에 대한 지지 에 감 사 드 립 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Express + AWS S3 이미지 업로드하기웹 사이트 및 모바일 애플리케이션 등에서 원하는 양의 데이터를 저장하고 보호할 수 있다. 데이터에 대한 액세스를 최적화, 구조화 및 구성할 수 있는 관리 기능을 제공한다. AWS S3 에 저장된 객체에 대한 컨테이너...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.