でキャッチ使用しているとき、私は(バベルとのWebPACKでtranspiled)このようなJSON-RPCプロバイダを持っている:
export default function() {
var id = 1;
function request(method, params) {
return JSON.stringify({
id: id++,
method: method,
params: params || []
});
}
var uri;
this.setup = function(user_uri) {
uri = user_uri;
};
this.$get = ['$http', '$q', function($http, $q) {
function rpc(method, params) {
return $http({
method: 'POST',
url: uri,
data: request(method, params)
}).then(response => response.data);
}
var defer = $q.defer();
rpc('system.describe').then(data => {
var service = {};
data.result.procs.forEach(spec => {
service[spec.name] = function(...args) {
var defer = $q.defer();
if (args.length == spec.params.length) {
return rpc(spec.name, args).then(data => {
if (data.error) {
defer.reject(data.error);
} else {
defer.resolve(data.result);
}
});
} else {
defer.reject('Invalid arity expected ' +
spec.params.length +
' got ' +
args.length);
}
return defer.promise;
};
});
defer.resolve(service);
});
return defer.promise;
}];
};
と私は1つの関数を呼び出す:
service.login('user', 'password').then(function(token) {
if (token) {
localStorage.setItem('notes_token', token);
localStorage.setItem('notes_username', 'user');
}
console.log('token: ' + token);
}).catch(function(error) {
console.log(error);
});
要求がエラーを返すと私はコンソールでこれを持っています:
トークン:未定義 [エラー]おそらく未処理の拒否:使用r非アクティブ
なぜ私はcatch
からconsole.logを取得せず、then
を実行しましたか?
私も試してみた:
service.login('user', 'password').then(function(token) {
if (token) {
localStorage.setItem('notes_token', token);
localStorage.setItem('notes_username', 'user');
}
console.log('token: ' + token);
}, function(error) {
console.log(error);
});
と同じ結果を得ます。私は角度1.6.3を使用しています。
は[繰延アンチパターン](http://stackoverflow.com/q/23803743/1048572?What-is-the-promise-construction-antipattern-and-を避けるために使用したいと思うでしょうどのように回避するか)! – Bergi