如何在JavaScript中保留以下异步模式DRY?

时间:2012-06-20 21:52:07

标签: javascript

基本模式是,如果X异步执行某些操作,则同步执行某些操作。例如

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

困扰我的是以下

render(page, {var: myVar});

因为重复相同的代码。是否有某种方法可以将该逻辑封装在一个地方?

3 个答案:

答案 0 :(得分:2)

当然,请使用其他功能。

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

if (varNotSet) {
    setVarAsynchronously(result) {
        // process result then...
        resolve();
    }
}
else resolve();

答案 1 :(得分: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对象来进行回调,它只是一个可选的东西,允许您将deferred的状态设置为能够添加回调侦听器。否则您可以在延迟时间内执行所有操作对象

答案 2 :(得分: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});
});