0

次のような状況があります (jsFiddle -> http://jsfiddle.net/sMuWK/も参照):

function CallBackStringHandler() {
    this.callback = function(){return null};
};

CallBackStringHandler.prototype.doTheMagic = function(callback) {
    var result = callback.call(this);
        if(result == null)
            alert("Nothing to handle yet...");
        else
            alert("End the result is: \n\n" + result);
};

function Action(){
    var result = null;
    var max = 10;
    var index = 0;
    var processor = setInterval(function(){
        if(index <= max){ //Processing step
            if(result == null)
                result = "" + index;
            else
                result += index;
            index++;
        } else { //Done
            clearInterval(processor);
            alert(result);
        }
    },10);
    return result;
};

function Run(){    
    var handler = new CallBackStringHandler();
    handler.doTheMagic(Action);
};

Run();

スクリプト (jQuery プラグイン) を使用すると、文字列を返す必要があるコールバックを指定できます。この文字列は、このスクリプトによって処理されます。

ここまでは順調ですね。

パフォーマンスとページの応答性を維持するために、この文字列をマルチスレッドで構築したいと考えています。これはまだ Web 標準ではないため、setInterval を使用してこれをシミュレートします。

このやり方の本質は、結果を待たないことだということを今では知っています。

しかし、物事の応答性と速度を維持し、完全な結果をハンドラーに返す方法は考えられません。

したがって、最終結果 (この例では) は次のように表示されます: 012345678910.

ヘルプ/手がかりをいただければ幸いです。

乾杯、別のオタク。

4

2 に答える 2

0

最終的な答えとして、私はこのように解決しました(fork here):

function CallBackStringHandlerBy3rdParty() {};

CallBackStringHandlerBy3rdParty.prototype.doMagic = function(callback) {
    var result = callback.call(this);
    alert(result);
};

CallBackStringHandlerBy3rdParty.prototype.doMyOwnMagic = function(result) {
    if(result.isComplete) {
        this.doMagic(function(){return result.value;});
    } else {
        var that = this;
        result.value += 1;
        if(result.value < 10)
            setTimeout(function(){that.doMyOwnMagic(result);},10);      
        else {            
            result.isComplete = true;
            this.doMyOwnMagic(result);
        }
    }
};

function Run(){    
    var handler = new CallBackStringHandlerBy3rdParty();
    var result = {};
    result.value = 0;
    result.isComplete = false;
    handler.doMyOwnMagic(result);
};

Run();

乾杯!

于 2013-05-29T15:19:02.333 に答える