5

我有一个关于 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();
});

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

提前致谢!

4

3 回答 3

5

你可以使用 Promises API 的always方法来执行一个函数,不管底层是Deferred成功还是失败。

queryResult
   .then(onSuccess, onFailure)
   .always(function() {
      standby.hide();
   });
于 2013-06-27T17:47:45.740 回答
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();
});

您可以看到这个示例小提琴,它说明了一个类似的,虽然简单的用例,其中无论 Deferred 是否被拒绝或解决,对第二个的回调Deferred#then都会在初始错误/成功回调之后触发。

于 2013-06-27T17:39:40.833 回答
-1
var deferred = new Deferred(); 
deferred.promise.always( function() { alert('ciao'); } );
于 2015-11-25T16:03:01.067 回答