2016-09-30 3 views
0

私はこのようなデザインを持っています。私は拒絶が起こった後にもう何も実行されないことを望んだが、最後の.fail。繰延チェーン、Node.jsのとq、すべてのチェーンの部品のための1つのErrorHandlerのは

私の「CHECKDATAは」この(いやそのチェーンにおける唯一の同期一部)のようになります。deferred.rejectが呼び出された場合でも、

var checkData = function(args){ 
    var deferred = q.defer(); 
    var fields = args[0]; 
    var files = args[1]; 
    var file = args[1].uploadedFile0; 
    var secondFile = args[1].uploadedFile1;  
    if(file.type !== "application/javascript"){ 
     return deferred.reject("please only upload javascript-files"); 
    } 
    (...) 
    return deferred.resolve([fields, file]); 
} 

、私は渡された引数なしで「findCommand」で終わります。私はこの鎖に間違ったことを理解していますか?

また、質問:このデザインは良いパターンですか?または、他の/より良いベストプラクティスがありますか?

+0

は、あなたが本当に各 '、その後の内部の応答の検証を行うべきです(... ) 'あなたの約束の声明。応答に期待される内容が含まれていない場合、約束を破ります。 –

+0

しかし、すべてのフェイルコールバックは、同じことをするでしょう... "onUploadFailed"を呼び出し、エラーを拒否に渡します。これは私にとってはコードの重複のように思え、読みやすさを低下させます。私は拒否するのではなくexeptionを投げることを考えました.q-documentationが上記のチェーンのエラーをキャッチすると "キャッチ"メソッドが言います。しかし、これらは少し臭いようです – IntegerWolf

+2

私はブルーバードを使用しているのでわかりませんが、すべてのケースで遅延したプロンプトを返すべきだと思います。 – Keith

答えて

2

checkData()が約束チェーンの先頭にあった場合、それは戻って、あなたのown answerのように書かれる必要があるだろう明白な約束。

ミッドチェーンでは、そのように書かれたときにも機能しますが、ミッドチェインでは、書いたものについてより良いオプションが得られます。投げる代わりの代わりに約束包まれたデータのデータを返す拒否約束、

  • を返す

    • 具体的には、次の方法で約束を作成して返すために必要性を回避することができます。

    ので、約束のチェーンを開始するために他の場所で使用されることはありませんcheckData()を提供し、それはこのように書くことができます。

    var checkData = function(args) { 
        var fields = args[0], 
         files = args[1], 
         file = args[1].uploadedFile0, 
         secondFile = args[1].uploadedFile1;  
        if(file.type !== "application/javascript") { 
         throw new Error("please only upload javascript-files"); // always throw an Error object, thus emulating a natural Error. This error will percolate down to the `.fail(onUploadFailed.bind(this, res))` handler. 
        } 
        (...) 
        return [fields, file]; // the next step in the chain will assimilate a promise or data. 
    } 
    
  • 0

    それは文法問題だった彼のコメントにキースによってadvicedとして、解決策:

    var checkData = function(args){ 
        var deferred = q.defer(); 
        var fields = args[0]; 
        var files = args[1]; 
        var file = args[1].uploadedFile0; 
        var secondFile = args[1].uploadedFile1;  
        if(file.type !== "application/javascript"){ 
         deferred.reject("please only upload javascript-files"); 
        } 
        else{ 
         deferred.resolve([fields, file]); 
        }   
        return deferred.promise; 
    } 
    
    +0

    この関数が同期的であるとすれば、遅延をまったく使用しないでください。満たされた/拒絶された約束を作るのに 'Q' /' Q.reject'を使い、 'checkData'が' then'ハンドラとして使われるときと同じ効果を持つ 'return'と' throw'だけを使います。 – Bergi

    関連する問題