2017-01-24 16 views
0

私はAngularJS v 1.5.0を使用しています。 Chrome版55.0.2883.95です。私が見ているエラーは、this SO postと同様のエラー動作を示していますが、私の状況のエラーの説明はObjectです。「return logFn.apply(console、args);」のAngularJS Nonstescriptエラー;

私はcreated a plunkerにエラーを示しています。プランナーでデベロッパーコンソールを開き、エラーを確認します。

angular.js:13550 Object {httpStatusCode: 503, error: Object}

劇中AngularJSコードは次のとおりです:

function consoleLog(type) { 
    var console = $window.console || {}, 
     logFn = console[type] || console.log || noop, 
     hasApply = false; 

    // Note: reading logFn.apply throws an error in IE11 in IE8 document mode. 
    // The reason behind this is that console.log has type "object" in IE8... 
    try { 
    hasApply = !!logFn.apply; 
    } catch (e) {} 

    if (hasApply) { 
    return function() { 
     var args = []; 
     forEach(arguments, function(arg) { 
     args.push(formatError(arg)); 
     }); 
     return logFn.apply(console, args); // Error thrown on this line 
    }; 
    } 

    // we are IE which either doesn't have window.console => this is noop and we do nothing, 
    // or we are IE where console.log doesn't have apply so we log at least first 2 args 
    return function(arg1, arg2) { 
    logFn(arg1, arg2 == null ? '' : arg2); 
    }; 

Error Image

012以下のサービスを考えると

this.test = function() { 
    return $q(function(resolve, reject) { 
     var errorObject = { 
      httpStatusCode: 503, 
      error: { 
       code: 5030, 
       message: 'Oh no! Something went wrong, please try again' 
      } 
     }; 
     reject(errorObject); 

    }).then(function successCallback(response) { 
     return response; 
    }).catch(function errorCallback(response) { 
     throw response; 
    }); 
}; 

AngularJSコードは、次のエラーを生成します

var test = function() { 
    userService.test() 
     .then(function successCallback(responseObject) { 
      console.log('Beginning of then'); 
     }) 
     .catch(function errorCallback(errorResponseObject) { 
      console.log('Beginning of catch'); 
     }); 
} 

エラーは、私が約束拒否を処理し、それを再投げていたという事実に起因すると思わ:ここでは

は、私がサービスを呼び出す方法です。捕まえておらず、また転覆しなければ、私は間違いがない。キャッチして再投げているときにエラーが表示されるのはなぜですか?


更新:キャッチ約束拒否を拒否するように$ qをサービスを使用して、私が見ていたAngularJSエラーを回避できることが表示されます。今のところこのアプローチを使用しますが、なぜpromise catchを投げ捨てるとエラーが発生するのかについては興味があります。エラーなし

例コード:

this.test = function() { 
    return $q(function(resolve, reject) { 
     var errorObject = { 
      httpStatusCode: 503, 
      error: { 
       code: 5030, 
       message: 'Oh no! Something went wrong, please try again' 
      } 
     }; 
     reject(errorObject); 

    }).then(function successCallback(response) { 
     return response; 
    }).catch(function errorCallback(response) { 
     return $q.reject(response); 
    }); 
}; 

答えて

0

私は私の質問への答えであると信じるものを見つけました。次のことを指摘し@gkalpak AngularJSのGithubの問題セクション、上this discussionに埋もれ:

The only difference between them is that return $q.reject(anything) will just pass anything down the chain, while throw anything will additionally pass anything to the $exceptionHandler. Other than that, both methods work the same.

ので、問題は、私の知る限りそれを理解するよう、$exceptionHandlerがコンソールに例外を出力していることです。私のアップデートで述べたように$q.rejectを使用すると、この動作が回避され、コンソールエラーを回避するための私の推奨される解決策です。

this.test = function() { 
    return $q(function(resolve, reject) { 
     var errorObject = { 
      httpStatusCode: 503, 
      error: { 
       code: 5030, 
       message: 'Oh no! Something went wrong, please try again' 
      } 
     }; 
     reject(errorObject); 

    }).then(function successCallback(response) { 
     return response; 
    }).catch(function errorCallback(response) { 
     return $q.reject(response); 
    }); 
}; 

更新 - サンダース-EIAのは、以下の答え@に基づいて、一般的に、非同期の機能のうち、例外をスローする悪い習慣です。この声明は、$ q.rejectアプローチをさらに強化しています。

0

この質問は、約束は(AngularJSの$ qを含む)をどのように動作するかにAngularJSとはるかとは何の関係もありません。 .catchに投じると問題が発生する可能性があります。アクセルはありexcellent explanation

あなたが迅速かつ汚い方法は、あなたはこのトリックを使用することができます(他のロギングメカニズムや)をコンソールに例外を取得したい場合:

.catch((err) => setTimeout(() => throw err));

またはそのES5バリアント:

.catch(function (err) { setTimeout(function() {throw err},0)})

これがあると、エラーを維持し、それを変更することなく、約束チェーンからそれを取得します。 しかし、私はAxelが彼の記事で説明する方法を組み込む方が良いと思います。

関連する問題