결국 실행되도록 자바 스크립트 함수를 대기열에 저장하는 방법
이 질문에 이미 답변이 있습니다.
javascript에서 Queue 클래스를 만들었으며 함수를 대기열에 데이터로 저장하고 싶습니다. 그렇게하면 요청 (함수 호출)을 만들고 필요할 때 응답 (실제로 함수 실행) 할 수 있습니다.
함수를 데이터로 저장하는 방법이 있습니까?
.setTimeout("doSomething()", 1000);
제외하고는
functionQueue.enqueue(doSomething());
doSomething ()을 데이터로 저장하므로 큐에서 데이터를 검색 할 때 함수가 실행됩니다.
따옴표로 묶인 doSomething ()-> "doSomething ()"이 있어야하고 어떤 방법은 문자열을 사용하여 함수를 호출해야한다고 생각합니다. 누구든지 그 방법을 알고 있습니까?
모든 함수는 실제로 변수이므로 실제로 모든 함수를 배열에 저장하는 것이 매우 쉽습니다 (를 사용하지 않고 참조하여 ()
).
// Create your functions, in a variety of manners...
// (The second method is preferable, but I show the first for reference.)
function fun1() { alert("Message 1"); };
var fun2 = function() { alert("Message 2"); };
// Create an array and append your functions to them
var funqueue = [];
funqueue.push(fun1);
funqueue.push(fun2);
// Remove and execute the first function on the queue
(funqueue.shift())();
함수에 매개 변수를 전달하려는 경우 이것은 좀 더 복잡해 지지만 일단 프레임 워크를 설정하면 이후에 매번 쉬워집니다. 기본적으로 수행 할 작업은 호출 될 때 특정 컨텍스트 및 매개 변수 세트로 미리 정의 된 함수를 실행하는 래퍼 함수를 만드는 것입니다.
// Function wrapping code.
// fn - reference to function.
// context - what you want "this" to be.
// params - array of parameters to pass to function.
var wrapFunction = function(fn, context, params) {
return function() {
fn.apply(context, params);
};
}
이제 래핑을위한 유틸리티 함수가 생겼으므로 향후 함수 호출을 생성하는 데 어떻게 사용되는지 살펴 보겠습니다.
// Create my function to be wrapped
var sayStuff = function(str) {
alert(str);
}
// Wrap the function. Make sure that the params are an array.
var fun1 = wrapFunction(sayStuff, this, ["Hello, world!"]);
var fun2 = wrapFunction(sayStuff, this, ["Goodbye, cruel world!"]);
// Create an array and append your functions to them
var funqueue = [];
funqueue.push(fun1);
funqueue.push(fun2);
// Remove and execute all items in the array
while (funqueue.length > 0) {
(funqueue.shift())();
}
이 코드는 래퍼가 배열 또는 일련의 인수를 사용하도록 허용하여 개선 할 수 있습니다 (하지만 그렇게하면 제가 만들려는 예제가 혼란스러워 질 것입니다).
여기에 게시 된 정식 답변
다음은 시간 제한을 사용 하지 않고 사용할 수있는 멋진 Queue 클래스 입니다.
var Queue = (function(){
function Queue() {};
Queue.prototype.running = false;
Queue.prototype.queue = [];
Queue.prototype.add_function = function(callback) {
var _this = this;
//add callback to the queue
this.queue.push(function(){
var finished = callback();
if(typeof finished === "undefined" || finished) {
// if callback returns `false`, then you have to
// call `next` somewhere in the callback
_this.next();
}
});
if(!this.running) {
// if nothing is running, then start the engines!
this.next();
}
return this; // for chaining fun!
}
Queue.prototype.next = function(){
this.running = false;
//get the first element off the queue
var shift = this.queue.shift();
if(shift) {
this.running = true;
shift();
}
}
return Queue;
})();
다음과 같이 사용할 수 있습니다.
var queue = new Queue;
queue.add_function(function(){
//start running something
});
queue.add_function(function(){
//start running something 2
});
queue.add_function(function(){
//start running something 3
});
마지막에 ()없이 저장하고있는 함수를 참조하십시오. doSomething
변수 (함수)입니다. doSomething()
함수를 실행하기위한 명령입니다.
나중에 큐를 사용할 때 다음과 같은 것을 원할 것 (functionQueue.pop())()
입니다. 즉, functionQueue.pop을 실행 한 다음 해당 호출의 반환 값을 pop으로 실행합니다.
함수 객체 의 .call () 메서드를 사용할 수도 있습니다 .
function doSomething() {
alert('doSomething');
}
var funcs = new Array();
funcs['doSomething'] = doSomething;
funcs['doSomething'].call();
또한 대기열에 직접 함수를 추가 할 수도 있습니다.
funcs['somethingElse'] = function() {
alert('somethingElse');
};
funcs['somethingElse'].call();
'Programing' 카테고리의 다른 글
추가 메소드 후 Jquery 클릭 이벤트가 작동하지 않음 (0) | 2020.10.31 |
---|---|
InternalsVisibleTo 속성이 작동하지 않습니다. (0) | 2020.10.31 |
터미널에서 vim을 사용하는 방법은 무엇입니까? (0) | 2020.10.31 |
Python의 백그라운드 함수 (0) | 2020.10.30 |
python 버전에 따라 requirements.txt (0) | 2020.10.30 |