【发布时间】:2014-12-18 22:05:57
【问题描述】:
我当前的 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 的 deferred/promises 支持之类的东西来编写更喜欢的东西:
$.when(doStep1).then(doStep2).then(doStep3).then(displayResult);
但显然这不是正确的语法,我不确定我是否真的理解我应该使用什么语法来实现这一点,因为我尝试过的所有内容最终看起来都比我上面的 run() 函数更复杂,这违背了目的。 为了踢球,我实际上编写了我自己的 'when' 和 'then' 版本,这将允许上述语法(你仍然必须调用,例如 'resolve' 或最后的其他东西才能实际进行调用,请注意),所以我知道这应该是可能的,但也许 jQuery 库不是为这种情况设计的?
【问题讨论】:
-
这里使用“async”和“q”回答了类似的问题:stackoverflow.com/questions/23750280/…
-
作为小类/插件:fiddle.
-
并传递值:fiddle.
-
令人印象深刻,这实际上确实工作得很好......但这确实意味着必须编写具有非常特殊签名的回调函数,我想知道它也会如何看待错误处理.非常感谢你,即使我还没有完全理解它。
标签: jquery asynchronous deferred