2017-05-01 8 views
0

私はajax呼び出しを行う関数とエラーを処理する関数を持っています。ターゲットは次のとおりです。エラーを後で使用するためのより良いフォーマットに操作します(下記の例を参照)。JS Promises:エラー処理の概念

問題:.then()の2番目のコールバックは呼び出されません。

コード:

function _handleError(error) { 
    //bring error info in better usable format 
    ... 

    return errorRes; 
} 

function getSth(...) { 
    ... 
    return $.ajax({ 
     url: baseUrl + query, 
     type: "GET", 
     headers: { 
      ... 
     } 
    }).then(function (data) { 
     var results = data.d.results; 

     ... //Do mapping stuff 

     return results; 
    }, _handleError); 
} 

私はそれを実装したいと思います方法:

getSth(...).then(function(results){ 
    ... 
}, function(err){ 
    console.log(err); 
    ... //Do more with error info 
}); 

.then()に与えられた第二の機能は_handleError()ががある、と呼ばれることは決してありません。私はPromiseのコンセプトに関する何かを誤解していると確信しています。

答えて

1

_handleErrorが呼び出された後、あなたが拒否されたとして約束チェーンは続けたい、場合は、throwまたは_handleError内から拒否された約束を返すためにどちらかが必要です。

何も返さない場合、またはhandleErrorから通常の値を返す場合、Promiseインフラストラクチャはエラーを「処理した」とみなし、もはやエラーではありません。これはtry/catchの後にモデル化されています。ここではcatchエラーが発生し、再スローしない場合、例外は処理されたものとみなされ、上位レベルに伝播しません。

例:

function _handleError(err) { 
    // do something to the error value 
    let newError = new Error(...); 

    // rethrow the error so the promise continues as rejected 
    // and so that the next error handler on that promise chain will get called 
    throw newError; 
}