基本模式是,如果X异步执行某些操作,则同步执行某些操作。例如
if (varNotSet) {
setVarAsynchronously(function(callback) {
// process callback then...
render(page, {'var': myVar});
});
}
else
render(page, {'var': myVar});
困扰我的是以下
render(page, {var: myVar});
因为重复相同的代码。是否有某种方法可以将该逻辑封装在一个地方?
答案 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});
});