2013-06-27 11 views
5

dojo/Deferredに関する質問があります。私は質問から始めて、次に私がやっていることについてもっと詳しく説明します:finallyブロックのように、遅延の結果に関係なく、同じ行のコードを実行する方法はありますか? try...catch声明?私が読んだことから、それはそこにあるようには見えませんが、多分ドキュメントを間違って理解していて、SOコミュニティでそのことを確認したかったのです。Dojo Deferredオブジェクトが解決または拒否された後に共通コードを実行する方法は?

は、ここで私がやっているものだ:

道場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(); 
}); 

これは正常です。しかし、おそらく、私は、1行ではなく複数行のコードを使用する遅延完了後に実装するプロセスをいくつか持つことができ、これらのコード行を複製したくないということがあります。別の方法として、プライベート関数を作成し、各ブロックに1つのライナーで呼び出す方法がありますが、より良い方法があれば、そのルートを取ることにします。

ありがとうございます!

答えて

5

Promises APIのalwaysメソッドを使用して、基になるDeferredが成功するか失敗するかにかかわらず、関数を実行できます。

queryResult 
    .then(onSuccess, onFailure) 
    .always(function() { 
     standby.hide(); 
    }); 
2

これは良い質問です。 が呼び出されると、dojo/Deferredオブジェクトは別の遅延オブジェクトを返します。これにより、一連の順序で起動される複数のコールバックと異なるチェーンをチェーンすることができます。あなたは、二Deferred#thenへのコールバックが発射されるに関係なく、拒否または解決された繰延た場合の簡単な、ユースケースどこにもかかわらず、同様の説明see this example fiddleをすることができます

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

:したがって、私はあなたがこのような何かを行うことができると信じて最初のエラー/成功コールバックの後。

+0

あなたの答えの両方が正しいので、あなたと@Lucas両方は私の質問に答えています。 @Lucasに「ベストアンサー」を与えました。私は、「いつも」は追加の「それ」よりも明確な意図を表していると思うからです。しかし私はその正しさについてあなたの答えに投票しました。 – David

-1
var deferred = new Deferred(); 
deferred.promise.always(function() { alert('ciao'); }); 
+0

これは、既存の回答に何も追加していないようです。 – Bergi

+0

はい、defferedは約束を引き延ばすので、私は.then()関数をコールせずにコールバック関数を設定しなくてもpromiseプロパティを使用します。 – max4ever

+0

OPには結果依存のコールバック関数も必要なので、他の答えは '.then()'を使います。正確な質問がある – Bergi

関連する問題