我对dojo / Deferred有疑问。我将从问题开始,然后详细了解我正在做的事情:
有没有办法执行相同的代码行,而不管延迟的结果如何,有点像finally
语句中的try...catch
块?从我所看到的,它似乎没有,但也许我理解文档错误,并希望与SO社区验证。
这就是我正在做的事情:
在Dojo 1.9(也适用于1.8)中,我在加载一些数据之前为ContentPane实例化了一个dojox.widget.Standby(加载叠加层)。延期通话完成后,我想隐藏我的叠加层,如下所示:
standby = new Standby({
... // standby props
});
this.addChild(standby);
standby.show();
queryResults = grid.store.query({
... // query props
});
queryResults.then(function (results) {
if (results) {
... // do something
}
standby.hide();
}, function (error) {
... // handle error
standby.hide();
});
这很好用;但是,据推测,我可以在延迟完成之后实现一些进程,这些进程占用几行代码而不是一行,我不想复制那些代码行。另一种方法是创建一个私有函数,并在每个块中用一个单行调用它,但如果有更好的方法,我宁愿采取这种方式。
提前致谢!
答案 0 :(得分:5)
无论底层Deferred
成功还是失败,您都可以使用Promises API的always方法执行函数。
queryResult
.then(onSuccess, onFailure)
.always(function() {
standby.hide();
});
答案 1 :(得分:2)
这是一个很好的问题。调用dojo/Deferred
时,Deferred#then
对象将返回另一个Deferred对象。这允许您链接不同的多个回调,这些回调以串行顺序触发。因此,我相信你可以这样做:
queryResults.then(function (results) {
if (results) {
... // do something
}
}, function (error) {
... // handle error
}).then(function(data){
// This will be fired with data returned from the previous callback.
standby.hide();
});
你可以see this example fiddle说明一个类似但尽管简单的用例,无论Deferred是否被拒绝或解决,在第二次Deferred#then
的回调在初始错误/成功回调后被触发
答案 2 :(得分:-1)
var deferred = new Deferred();
deferred.promise.always( function() { alert('ciao'); } );