Programing

결국 실행되도록 자바 스크립트 함수를 대기열에 저장하는 방법

crosscheck 2020. 10. 31. 09:21
반응형

결국 실행되도록 자바 스크립트 함수를 대기열에 저장하는 방법


이 질문에 이미 답변이 있습니다.

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();

참고 URL : https://stackoverflow.com/questions/899102/how-do-i-store-javascript-functions-in-a-queue-for-them-to-be-executed-eventuall

반응형