繁体   English   中英

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

[英]How can I keep the following asynchronous pattern DRY in JavaScript?

基本模式是,如果X异步执行其他操作,而其他同步执行。 例如

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

以下是困扰我的事情

render(page, {var: myVar});

因为重复了相同的代码。 有什么办法可以将逻辑封装在一个地方?

当然,请使用其他功能。

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

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

如果您使用的是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});
});

如果延迟对象的承诺已经解决,则其回调将立即运行,否则将在解析后运行。 稍后,您可以使用.done()将更多的回调附加到Promise,如果解析了延迟的对象,则将立即调用所有这些回调。 (您不必从延迟的对象中创建承诺对象来进行回调,这只是一个可选操作,它使您能够将设置延迟的状态与能够添加回调侦听器分开。否则,您可以对延迟的对象执行所有操作宾语。

完全通用的方法可以是这样的辅助函数:

// 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});
});

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM