我当前的javascript代码看起来基本上像::
function doStep1(callback) {
thirdPartyLib.asyncExec('step1', {}, function(resp) {
callback(resp.value);
});
}
function doStep2(value, callback) {
thirdPartyLib.asyncExec('step2', value, function(resp) {
callback(resp.value);
});
}
function doStep3(value, callback) {
thirdPartyLib.asyncExec('step3', value, function(resp) {
callback(resp.value);
});
}
function displayResult(value) {
$('#input').enable();
$('#result').text(value);
}
function run() {
doStep1(function(x){doStep2(x,function(y){doStep3(y,displayResult)}});
}
即,我们需要调用三个独立的异步函数,从而将每个函数的结果传递给下一个函数。但即使在这个非常简化的版本中,语法也非常糟糕。我希望我可以使用类似jquery的延迟/承诺支持来编写更喜欢的内容:
$.when(doStep1).then(doStep2).then(doStep3).then(displayResult);
但显然这不是正确的语法,我不确定我是否真的理解我应该使用什么语法来实现这一点,因为我尝试的所有内容最终看起来比上面的run()函数更复杂,这打败了目的。 对于踢,我实际上写了我自己的'when'和'then'版本,这将允许上面的语法(你仍然必须打电话,例如'解析'或者最后的东西来实际打电话,请注意),所以我知道它应该是可能的,但是jQuery库可能不适合这种情况吗?
答案 0 :(得分:2)
有很多方法可以写这个。你写的具体取决于未简化代码的性质。
让我们做一个假设:
所有第三方通话的形式都类似于通用的 可以编写
doStep()
函数,可以命令它执行 任何一步。
将简化代码置于面值,然后满足此假设并且代码相当简单:
function doStep(step, value) {
return $.Deferred(function(dfrd) {
thirdPartyLib.asyncExec(step, value, dfrd.resolve);
}).then(function(resp) {
return resp.value;
});
}
function displayResult(value) {
$('#input').enable();
$('#result').text(value);
}
function run(steps) {
return steps.reduce(function(promise, step) {
return promise.then(function(value) {
return doStep(step, value);
});
}, $.when( {} ));// the empty object here becomes the `value` passed anongside 'step1'.
}
//The asychronous sequence is determined by an array passed to run()
run(['step1', 'step2', 'step3']);
如果每个第三方电话的形式不同,那么代码会更复杂,但可能仍然不会太糟糕。