2016-05-12 17 views
0

ネストされた.then関数を連鎖させて成功関数を呼び出そうとしていますが、コールバックは開始自体を呼び出しています。Angular.jsの関数とコールバック成功関数をチェーンする方法

//public method fn 
function fn(callback) { 
//calling the 1st API request 
fn1() 
    .then(function(response) { 
    //2nd API request function 
    call1(response); 
    }, function(error) { 
    return $q.reject({ 
    responseStatus: error.status 
    }); 

    }) 
    // Returning response 
    .then(function(response) { 
    callback({ 
    responseStatus: 200 
    }); 
    }, function(error) { 
    callback({ 
     responseStatus: 500 
    }); 
    }); 
} 

function call1(response) { 
    //2nd API 
    fn2() 
    .then(function(response) { 
    //3rd API request function 
     call2(response); 
     }, function(error) { 
     return $q.reject({ 
     responseStatus: error.status 
     }); 
    }); 
} 


function call2(response) { 
    //3rd API request 
    fn3() 
    .then(function(response) { 
     return lastfunction(); 
     //here i need to callback the success response status 
     }, function(error) { 
     return $q.reject({ 
     responseStatus: error.status 
     }); 
    }); 
} 


function fn1(){ 
//some code 
} 
function fn2(){ 
//some code 
} 
function fn3(){ 
//some code 
} 

//Controller 

//i will show response status callback here 

if(response.status ==200){ 
    show output; 
} 
else{ 
    //response 500 
    show errors; 
    } 

基本的に私はすべてのサービスコール上の他のコントローラに「200」応答ステータスをコールバックする必要が成功していると、1つの要求が失敗した場合でも、私は「500」を送っする必要があります。私のコードの応答ステータス '200'は最初の.then関数自体を呼び出しています。このサービスコールをqueとして呼びたい

何か助けていただければ幸いです。

答えて

3

あなた{ responseStatus: x }目的は、成功パス誤差経路によって当然のを提供することができるフロー制御の目的のためだけに存在します約束は、fn()によって返されます。

また、約束通りに、fn()にコールバックを渡す必要はありません。実際にはそうすることは悪い習慣と考えられます。だから、最初の

、すべて

  • リターンの連鎖
  • 成功簡素化し、それぞれの低レベル関数からの約束を通じて

    • パージcallback
    • パージ不要なエラーハンドラ
    function fn() { 
        return fn1().then(call1); 
    } 
    function call1() { 
        return fn2().then(call2); 
    } 
    function call2() { 
        return fn3().then(lastfunction); 
    } 
    function fn1() { 
        //some code that returns a promise 
    } 
    function fn2() { 
        //some code that returns a promise 
    } 
    function fn3() { 
        //some code that returns a promise 
    } 
    
    次のように0

    その後、呼び出し:

    fn().then(function(response) { 
        // success callback (your "200" condition) 
        // show output; 
    }).catch(function(error) { 
        // error callback (your "500" condition) 
        // show error; 
    }); 
    

    response varがlastfunction()が配信何になります。 responsefn1()fn2()fn3()で配信されているものの一部として集計したい場合は、lastfunction()で既に配信されています。その問題は包括的にhereに記載されています。

    error varは、fn()の実行中に発生する最初のErrorで、情報の損失はありません。 error.messageおよびerror.status(存在する場合)を読み取り/表示できます。

  • +0

    しかし、私の応答がcall2関数で失敗した場合、この方法ではエラーコールバックが正しく呼び出されません。 – rUI7999

    +0

    低レベル関数からの約束を返すことによって、エラー状態は自然に上向きに伝播します。したがって、 'call2()'やその他の場所でエラーが発生した場合は、エラーハンドラに入ります。 –

    +0

    これは魅力的な作品でした! – rUI7999

    2

    作成した約束を元に戻す必要があります。 .then()を使用すると、約束事を変更していないことを覚えておいてください。チェーン内に新しいものを作っています。

    約束を使用してコードは、(私のフォーマット)を返す:

    function fn(callback) { 
        return fn1() 
        .then(function(response) { 
         return call1(response); 
        }, function(error) { 
         return $q.reject({ 
         responseStatus: error.status 
        }); 
    
        }) 
        // Return response 
        .then(function(response) { 
         callback({ 
         responseStatus: 200 
         }); 
        }, function(error) { 
         callback({ 
         responseStatus: 500 
         }); 
        }); 
    } 
    
    function call1(response) { 
        return fn2() 
        .then(function(response) { 
         return call2(response); 
         }, function(error) { 
         return $q.reject({ 
         responseStatus: error.status 
         }); 
        }); 
    } 
    
    
    function call2(response) { 
        return fn3() 
        .then(function(response) { 
         return lastfunction(); 
         //here i need to callback the success response status 
         }, function(error) { 
         return $q.reject({ 
         responseStatus: error.status 
         }); 
        }); 
    } 
    
    
    function fn1(){ 
    //some code 
    } 
    function fn2(){ 
    //some code 
    } 
    function fn3(){ 
    //some code 
    } 
    
    +0

    返信いただきありがとうございます!はい、私は正常に連鎖していますが、成功とエラーでコールバックの応答ステータスを表示する必要があります – rUI7999

    +0

    @ rip1699このコードは問題を解決しないと言っていますか?あなたがそれを使用するときに見ている行動は何ですか? – Paarth

    +0

    同じ振る舞いで、私はコード内のreturn文について言及するのを忘れてしまった。基本的な応答は1番目の関数自体の後に呼び出されます – rUI7999

    関連する問題