【发布时间】:2014-09-09 18:08:16
【问题描述】:
我在 jQuery Deferreds 的帮助下链接了一系列相当复杂的异步函数。
基本上我有两个并行的函数流,然后是在并行流都完成时应该串行执行的函数。这是一个示例(它们是现实生活中的 AJAX 调用):
function makeOmelette() {
$.when(
crackEggs().then(beatEggs),
washTomatos().then(chopTomatos)
).then(mixEggsAndTomatos).then(fryEggsAndTomatos).done(function() {
msg('Omelette is ready!');
}).fail(function() {
msg('Oh no, omelette fail!');
});
}
最后的done() 和fail() 处理程序处理成功或失败。我希望 fail() 处理程序在出现任何问题时立即执行,在链中的任何位置,并停止所有进一步的执行。
大多数情况下,这是可行的——除了一种情况。如果在打鸡蛋时出现故障,那么番茄仍然会被清洗和切碎——即使在这些任务开始时已经发生故障。同样,如果清洗番茄失败,这并不会停止crackEggs 和beatEggs 函数的运行。
你可以看到an example here。
我对此的担忧是,在我的实际代码中,我不希望浏览器对服务器进行 AJAX 调用,这可能会改变状态,如果没有意义,因为整个过程已经失败.
有没有办法做我想做的事?我想我可以将失败处理程序单独附加到每个并行任务,但我想知道是否有一种不那么冗长/重复的方式。
谢谢!
【问题讨论】:
-
“大多数情况下,这是可行的——除了一种情况。如果打鸡蛋时失败,那么番茄仍然会被清洗和切碎”。是否要求如果
crackEggs()、washTomatos()的错误不会继续?谢谢 -
如果在
crackEggs()期间到washTomatos()应启动时已经发生错误,则不应执行washTomatos()。任何并行任务也是如此 - 如果在任务开始之前发生故障,则不应执行该任务。所以这更像是一个普遍的要求。
标签: javascript jquery jquery-deferred