0

基本的なパターンは、Xが非同期で何かを行う場合、それ以外の場合は同期で何かを行う場合です。例えば

if (varNotSet) {
    setVarAsynchronously(function(callback) {
        // process callback then...
        render(page, {'var': myVar});
    });
}
else
    render(page, {'var': myVar});

私を悩ませているのは次のとおりです

render(page, {var: myVar});

同じコードが繰り返されるからです。そのロジックを1か所にカプセル化する方法はありますか?

4

3 に答える 3

2

もちろん、別の関数を使用してください。

function resolve() {
    render(page, {'var': myVar});
}

if (varNotSet) {
    setVarAsynchronously(result) {
        // process result then...
        resolve();
    }
}
else resolve();
于 2012-06-20T21:54:06.187 に答える
1

jQueryを使用している場合は、組み込みの$ .Deferred関数を強くお勧めします。これはsincsバージョン1.5で利用できます。これは、作成したような問題を解決するために正確に作成されています。

jQueryを使用すると、次のようになります。

var def = new $.Deferred;
var promise = def.promise();
if (varNotSet) {
    setVarAsynchronously(function(callback) {
        def.resolve();
    });
}
else
    def.resolve();

promise.done(function () {
    render(page, {'var': myVar});
});

延期されたオブジェクトのpromiseがすでに解決されている場合、そのコールバックはすぐに実行されます。それ以外の場合は、解決されたときに実行されます。後で.done()を使用してpromiseにさらにコールバックをアタッチでき、遅延オブジェクトが解決された場合、それらすべてがすぐに呼び出されます。(コールバックを作成するために遅延オブジェクトからpromiseオブジェクトを作成する必要はありません。これは、遅延のステータスの設定とコールバックリスナーの追加を分離できるオプションです。それ以外の場合は、遅延ですべてを実行できます。物体。

于 2012-06-20T23:07:21.053 に答える
0

これを行うための完全に一般的な方法は、次のようなヘルパー関数である可能性があります。

// helper function
function runWhenVal(val, asynchFn, fn) {
    if (!val) {
        asynchFn(function(callback) {
            fn();
        });
    } else {
        fn();
    }
}

// using the helper function
runWhenVal(x, setVarAsychronously, function() {
    render(page, {'var': myVar});
});
于 2012-06-20T23:08:29.293 に答える