2010-08-13 2 views
2

У меня есть цепочка асинхронных вызовов, связанных друг с другом с помощью dojo.Deferred объектов в виде async-обертки (по крайней мере, как я ее понимаю) и функции .then(), чтобы «связывать» асинхронные вызовы.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»?

ответ

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/

+0

Я попробовал это в додзё 1.8. Если на then() есть errBacks, бросок не отменяет цепочку. Выполняются обратные вызовы err. Кажется, что не существует способа действительно сделать исключение в цепочке then. Этот закрытый дефект, похоже, указывает на это: https://bugs.dojotoolkit.org/ticket/3814 –

Смежные вопросы