NodeJs 로 지연 호출 을 실현 하여 정시 작업 의 폐쇄 문 제 를 회피 합 니 다.
이 문 제 를 해결 하 는 것 은 매우 간단 하 다. 우 리 는 콜백 리 셋 에서 이 대상 을 다시 어떤 방식 으로 얻 고 이 대상 이 이미 소각 되 었 는 지 확인 하면 위 에서 설명 한 문 제 를 피 할 수 있다.그러나 프로그램 에 이러한 수요 가 많이 필요 할 때 한 팀 이 코드 를 작성 하면 상기 상황 을 피하 기 어렵다.정시 작업 의 폐쇄 문 제 를 피하 기 위해 저 는 지연 호출 클래스 를 썼 습 니 다. 코드 는 다음 과 같 습 니 다.
/**
* script: delayCall.js
* description: ,
* authors: [email protected]
* date: 2016-04-19
*/
var util = require('util');
var PQueue = require('./pqueue').PQueue;
/**
*
* @param search_func
*/
var DelayCall = exports.DelayCall = function(search_func) {
//
this._call_seq = 0;
//
this._call_map = {};
//
this._call_queue = new PQueue(DelayCall.compare);
//
this._search_func = search_func;
// 。FIXME: run
// :setTimeout
this._interval_id = setInterval(() => {
this.run();
}, 1000);
};
//
DelayCall.compare = function(call1, call2) {
var time_diff = call1.exec_time - call2.exec_time;
if (time_diff) {
return time_diff;
} else {
return call1._call_id - call2._call_id;
}
};
//
DelayCall.prototype._addSequence = function() {
return ++ this._call_seq;
};
/**
*
* @param id _search_func id
* @param method_name
* @param params
* @param delay ,
*/
DelayCall.prototype.call = function(id, method_name, params, delay) {
var call_id = this._addSequence();
var exec_time = Date.now() + delay * 1000;
var call_elem = {
_call_id: call_id,
id: id,
method_name: method_name,
params: params,
delay: delay,
exec_time: exec_time,
_canceled: false,
};
this._call_queue.enQueue(call_elem);
this._call_map[call_id] = call_elem;
return call_id;
};
//
DelayCall.prototype.cancelCall = function(call_id) {
var call_elem = this._call_map[call_id];
if (call_elem) {
delete this._call_map[call_id];
call_elem._canceled = true;
}
};
//
DelayCall.prototype.run = function() {
var now = Date.now();
var pqueue = this._call_queue;
var search_func = this._search_func;
var call_elem = pqueue.getHead();
while (call_elem) {
if (call_elem._canceled) {
pqueue.deQueue();
} else {
if (now < call_elem.exec_time) {
break;
} else {
//
pqueue.deQueue();
delete this._call_map[call_elem._call_id];
//
var obj = search_func(call_elem.id);
if (obj && typeof obj[call_elem.method_name] == 'function') {
obj[call_elem.method_name](call_elem.params);
}
}
}
call_elem = pqueue.getHead();
}
};
PQueue 의 실현 은 나의 배 고 픈 다른 박문 을 참고 하 세 요: NodeJs 로 우선 순위 대기 열 PQueue 를 실현 합 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.