[英]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.