解决或拒绝Dojo Deferred对象后如何执行公共代码?

时间:2013-06-27 14:54:26

标签: javascript dojo promise deferred

我对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();
});

这很好用;但是,据推测,我可以在延迟完成之后实现一些进程,这些进程占用几行代码而不是一行,我不想复制那些代码行。另一种方法是创建一个私有函数,并在每个块中用一个单行调用它,但如果有更好的方法,我宁愿采取这种方式。

提前致谢!

3 个答案:

答案 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'); } );