Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/478.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 是否可以将多个错误处理程序附加到单个承诺?_Javascript_Angularjs - Fatal编程技术网

Javascript 是否可以将多个错误处理程序附加到单个承诺?

Javascript 是否可以将多个错误处理程序附加到单个承诺?,javascript,angularjs,Javascript,Angularjs,我一直在为一个项目使用angular的$http服务。在完成项目之前,我注意到.success和.error回调已被弃用。 现在我们有了。然后和。catch子句,很好 我有一个服务,它将调用包装到特定的API。在该服务中,我想“安装”一个默认的错误处理程序,以防出现未经授权的请求。我以前是这样做的: post = function(encodedData ,headers ,url ) { headers.Accept = '*/*'; this.setAutentic

我一直在为一个项目使用angular的$http服务。在完成项目之前,我注意到
.success
.error
回调已被弃用。 现在我们有了
。然后
。catch
子句,很好

我有一个服务,它将调用包装到特定的API。在该服务中,我想“安装”一个默认的错误处理程序,以防出现未经授权的请求。我以前是这样做的:

post = function(encodedData ,headers ,url ) {
    headers.Accept = '*/*';

        this.setAutentication();

    return $http({
      'url': url,
      'method': 'POST',
      'data': encodedData,
      'headers': headers
    }).error( this.callUnauthorizedHandler.bind(this) );
  };
如您所见,我返回了$http承诺,并且已经附加了一个错误处理程序。由于
.error
回调返回了最初的承诺,所以一切都很顺利。现在,我必须首先将承诺保存到一个变量,使用catch附加错误处理程序,然后返回承诺。
这不是什么大问题,但我觉得没有办法将多个“错误”处理程序附加到一个承诺中,因此如果我添加另一个
catch
子句,我想我将覆盖已经安装的一个。这是正确的吗?正确的管理方法是什么?我所读到的关于承诺的内容并没有具体说明这个想法是有效的还是绝对愚蠢的

编辑:

我找到了这个答案:
如果我的“默认”错误处理程序现在能够自己处理错误,我似乎必须从中抛出一个错误,但我不确定这一点。

承诺的工作方式是,错误传播在第一次捕获后停止

somePromise().then( /* ... */ ).catch( function () {
    console.log( 'Error 1' );
} ).catch( function () {
    // Will not execute
    console.log( 'Error 2' );
} );



// On the other hand, in this case...
var p = somePromise().then( /* ... */ );

p.catch( function () {
    console.log( 'Error 1' );
} );

p.catch( function () {
    // Will execute
    console.log( 'Error 2' );
} );
这是因为catch返回的承诺实际上是一个不同的对象

var p = somePromise.then( /*...*/ );

var x = p.catch( /*...*/ );

p === x // False
这意味着每次你调用
。然后
.catch
的缩写。然后(null,fn)
)你都会返回一个新的承诺

假设你想截获一个错误,但仍然让它传播。有两种方法

示例1

var p = somePromise();

p.catch( /*...*/ );

return p;
这是因为我们将多个侦听器附加到相同的承诺。因此,即使有人调用另一个
.catch
,它也会捕获它。 缺点:在有人调用了一个
.then
(从而在链中创建了一个新的promise实例)之后,下面的任何
.catch
都不会捕获错误(因为它在链中向上被捕获)

示例2首选


您可以只执行
返回$http({…}).catch(this.callUnauthorizedHandler…
这是我尝试的第一件事,但它没有返回最初的承诺。它返回catch语句的结果。是的,这就是预期的结果。也许我误解了你的问题。因此,您希望处理错误,但仍然向使用者返回成功?顺便说一句,如果你到处重复同样的东西,你可以把它集中在一个拦截器中。“我觉得没有办法把几个“错误”处理程序附加到一个承诺上。”。您的用例是什么?所有的错误处理应该能够封装在一个
catch
回调中。可能是我的错。我想要的是,透明地附加一个错误处理程序,以防收到“404”未经授权的响应。其他将使用返回承诺的函数不需要知道该错误处理程序。非常感谢您的详细解释。请注意,默认情况下,我只希望处理一种特定类型的错误,并将承诺的完整管理留给接收它的方法/函数,因此我不会调用任何
。然后从返回承诺的方法调用
。我认为在我的情况下,最好的方法是在示例1和示例2之间找到一个中间的解决方案。安装一个
catch
评估错误,如果无法处理,则返回
$q.reject(reason)
。我该不该回报被抓的承诺?我会这样做的:是的,你应该像在plnkr中一样,回报捕获所创造的承诺。非常感谢佩德罗。我会那样做的
return somePromise().then( /*...*/ ).catch( function ( reason ) {
   this.callUnauthorizedHandler( reason );

   // Here we can leverage the fact that all promises 
   // return a new promise, so we can just forge a promise 
   // that will reject right away with the value we want
   return $q.reject( reason );
} );