0

さまざまな機能を実行できるソリューションを探していますが、タイムアウトが必要なものもあり、後続のすべての機能は前の機能が完了するまで待機する必要があります。すべての関数は、完全なプロセスを中断できる必要があります。

今、私はすべての関数をスタックにプッシュし、それらをループすることを考えました:

function foo() {
    // bar() should wait as long the following is finished:
    setTimeout(function(){
        if ((new Date()).getSeconds() % 2) {
            alert('foo');
            // break loop through functions (bar is not called)
        }
        else {
            // start next function (bar is called)
        }
    }, 1000);
}
function bar() {
    setTimeout(function(){
        alert('bar')
    }, 1000);
}
var functions = new Array('foo', 'bar');
for (var i = 0, length = functions.length; i < length; i++) {
    window[functions[i]]();
}

しかし、待機/休憩を含める方法は?!

注:これは 2 つ以上の関数で動作するはずです (関数の数は変更可能です)。

注 2: jQuery を使用したくありません。

4

2 に答える 2

2

注:回答を更新しました。投稿の下部を参照してください。

よし、見てみよう。

メソッドを使用しているwindow[func]()ので、各関数からの戻り値を保存して使用できるはずです。

証明:

function a(){
    return "value";
}

var ret_val = window['a']();
alert(ret_val);

return ルールを作成しましょう:
関数が を返す場合true、実行フローを続行します。
関数が を返す場合false、実行フローを中断します。

function a(){
    //Do stuff
    return (condition);
}

for(i = 0; i < n; i++){
    var bReturn = window['function']();
    if(!bReturn) break;
}

それでは実践してみましょう。

function a(){
    //Do stuff
    return ((new Date()).getSeconds() % 2); //Continue?
}

function b(){
    //Do stuff
    return true; //Continue?
}

function c(){
    //Do stuff
    return false; //Continue?
}

function d(){
    //Do stuff
    return true; //Continue?
}

var functions = new Array('a', 'b', 'c', 'd');

for (var i = 0; i < functions.length; i++ ) {
    var bReturn = window[functions[i]]();
    if(!bReturn) break;
}

スクリプトをいつ実行するかに応じて、たとえば偶数または不均一な期間に応じて、関数のみを実行するaか、関数a b&を実行しますc。各機能の合間に、通常の業務に取り掛かることができます。
もちろん、条件はおそらく個々の関数ごとに異なります。

これが実際に動作しているJSFiddle の例を次に示します。


aたとえば、関数が false を返す場合、次の関数をスキップして次の関数、またはその次の関数に進むように、小さな変更を加えることができます。

変化

for (var i = 0; i < functions.length; i++ ) {
    var bReturn = window[functions[i]]();
    if(!bReturn) break;
}

これに

for (var i = 0; i < functions.length; i++ ) {
    var bReturn = window[functions[i]]();
    if(!bReturn) i++;
}

関数が false を返すたびに、1 つの関数をスキップします。

ここで試すことができます。


余談ですが、スクリプトを「一時停止」する待機関数を探している場合は、このコードを使用できます。

function pausecomp(millis){
    var date = new Date();
    var curDate = null;

    do { 
        curDate = new Date(); 
    }while(curDate-date < millis);
} 

アップデート

コードを調整した後、 で動作するようになりましたsetTimeout

アイデアは、配列内の最初の関数から始まるエントリ ポイントがあり、配列内の現在の場所のインデックス パラメーターを渡し、インデックスを 1 増やして次の関数を実行するというものです。

| コード

function next_function(index){
    if(index >= functions.length) return false;
    setTimeout(function(){
            window[functions[index+1]](index+1);
    }, 1000);
}

function a(index){
    //Do stuff
    if(((new Date()).getSeconds() % 2)) return false; //Stop?
    next_function(index);
}

function b(index){
    //Do stuff
    if(false) return false; //Stop?
    next_function(index);
}

function c(index){
    //Do stuff
    if(true) return false; //Stop?
    next_function(index);
}

function d(index){
    //Do stuff
    if(false) return false; //Stop?
    next_function(index);
}

var functions = new Array('a', 'b', 'c', 'd');

//entry point   
window[functions[0]](0);
于 2012-03-01T15:54:13.973 に答える
1

これはまさにシナリオが解決を約束するものです。特に、promiseが破られる可能性があるという事実は、(同期コードでスローされた例外のように)チェーンの続行を妨げるため、状況に最適です。

例として、上記のリンクされたスライドで説明されているQpromiseライブラリを使用します。

function fooAsync() {
    return Q.delay(1000).then(function () {
        if ((new Date()).getSeconds() % 2) {
            alert("foo");
            throw new Error("Can't go further!");
        }
    });
}

function barAsync() {
    return Q.delay(1000).then(function () {
        alert("bar");
    });
}

var functions = [fooAsync, barAsync];

// This code can be more elegant using Array.prototype.reduce, but whatever.
var promiseForAll = Q.resolve();
for (var i = 0; i < functions.length; ++i) {
    promiseForAll = promiseForAll.then(functions[i]);
}
// Of course in this case it simplifies to just
//     promiseForAll = fooAsync().then(barAsync);

promiseForAll.then(
    function () {
        alert("done!");
    },
    function (error) {
        alert("someone quit early!");
        // and if you care to figure out what they said, inspect error.
    }
).end();
于 2012-03-01T16:56:31.473 に答える