-2

私はコールバックの配列を持っているので、それぞれがジョブの完了時に実行される別のコールバックを受け取ります。例:

var queue = [
    function (done) {
        console.log('Executing first job');
        setTimeout(done, 1000); // actually an AJAX call here
            // I can't call abort() for the request
    },
    function (done) {
        console.log('Executing second job');
        setTimeout(done, 1000);
            // also AJAX call here
            // it is made from a third-party library that I can't change
            // this means that I can't call abort() on it
    },
    function (done) {
        console.log('Executing third job');
        setTimeout(done, 1000);
    },
    function (done) {
        console.log('Executing fourth job');
        setTimeout(done, 1000);
    } // and so forth
];

var proceed = true;

(function dequeue() {
    var fn = queue.shift();
    proceed && fn instanceof Function && fn(dequeue);
})();

すべてを高速化するために、たとえば 4 つのコールバックを一度に起動した方がよいことを除いて、私には問題ありませんが、他のproceed場所からフラグを変更することでそれ以上の実行を停止することもできます。それ、どうやったら出来るの?

このプロジェクトでは最新バージョンの jQuery を使用しているので、このタスクの達成に役立つものがライブラリにあれば、それを使用します。すべてがブラウザで行われます。

4

1 に答える 1

1

http://jsfiddle.net/2Jg6r/

var queue = [];
// let's think we have a thousand of jobs
for (var i = 0; i < 1000; i++) {
    (function(jobNumber) {
        queue.push(function (done) {
            console.log('Started job '+ jobNumber);
            setTimeout(function() {
                console.log('Finished job '+ jobNumber);    
                done();
            }, 1000);
        });
    })(i);
}

var proceed = true;

setTimeout(function() {
    console.log('Full stop called after 10 seconds');
    proceed = false;
}, 10000);

queue.depth = 0;
queue.maxDepth = 4;

(function dequeue() {
    while (queue.depth < queue.maxDepth) {
        queue.depth += 1;
        var fn = queue.shift();
        proceed && fn instanceof Function && fn(function() {
            queue.depth -= 1;
            dequeue();
        });
    }
})();
于 2013-06-19T07:09:36.070 に答える