dojo.Deferred:优雅地取消.then()链?

时间:2010-08-13 15:55:13

标签: asynchronous dojo

我有一系列异步调用,使用dojo.Deferred对象链接在一起作为异步包装器(至少我理解它)和.then()函数来“链接”异步调用。

在链中的任何一个链接上,某些测试可能会失败(例如我的异步存储提取没有返回任何对象等),我想优雅地退出整个.then()链。

这是使用链的形式。我如何杀死我指示的整个链?

asyncFunc(...).then( function(args) {
    //stuff...
    return myDeferredReturningFunction(args);
}).then( function(args2) {
    //do some test on args2
    //if test fails, **how to cancel the chain here?**
}).then( function(args3) { ... etc etc ...

注意:也许有人可以将其标记为“dojo.Deferred”?

1 个答案:

答案 0 :(得分:2)

抛出异常应该是一种简单的纾困方式,因为它会跳出任何回调并进入任何补充或后续的错误。

快速举例:

dojo.xhrGet({url:'base.php'})
    .then(function() { console.log('foo'); throw 'argh!';})
    .then(function() { console.log('bar'); }); // bar never gets printed

更多信息:

http://www.sitepen.com/blog/2009/03/31/queued-demystifying-deferreds/

http://www.sitepen.com/blog/2010/05/03/robust-promises-with-dojo-deferred-1-5/