处理已解决/拒绝的角度承诺

时间:2015-09-17 18:56:35

标签: javascript angularjs

处理已解决/拒绝的两种方式Angular承诺是否相同?

图表A

promise.then(function (value) {
  console.log('promise resolved with val', value);
  return 'resolved';
})
.catch(function (reason) {
  console.log('promise rejected with reason', reason);
  return 'rejected';              
})

图表B

promise.then(function (value) {
  console.log('promise resolved with val', value);
  return 'resolved';

}, function (reason) {
  console.log('promise rejected with reason', reason);
  return 'rejected';
});

我怀疑的原因是因为我读到then返回一个新的承诺,所以似乎A在功能上与

相同
var anotherPromise = promise.then(function (value) {
  console.log('promise resolved with val', value);
  return 'resolved';
});

anotherPromise.catch(function (reason) {
  console.log('promise rejected with reason', reason);
  return 'rejected';              
})

与B看起来不一样,因为catch正在处理对anotherPromise而不是promise的拒绝。

2 个答案:

答案 0 :(得分:3)

Promises使用方法链接返回promise的同一个实例,所以即使您在设置的版本中创建新版本的promise也是如此..

var anotherPromise = promise.then(function (value) {

.. promise和anotherPromise都指向同一个对象。

同样适用于:

var a = {};
var b = a;
a.monkey = 'banana';
console.log(b.monkey); // 'banana'

答案 1 :(得分:0)

它们在功能上是等价的,并且都会返回一个承诺。

在有2个回调的示例中,第二个回调将处理错误,但由于您仍在调用.then,您仍然会得到承诺。

意思是,如果您愿意,甚至可以在技术上做一些奇怪的事情:

promise.then(function (value) {
  console.log('promise resolved with val', value);
  return 'resolved';

}, function (reason) {
  console.log('promise rejected with reason', reason);
  return 'rejected';
})
.then(function(eitherValue) {
  console.log('eitherValue will be either "rejected" or "resolved"');
});