迁移已弃用的承诺处理代码

时间:2016-08-05 12:44:36

标签: javascript angularjs promise

我有一些处理像这样的Angular承诺的代码

somethingThatReturnsAPromise
  .then(function (data) {
    // handle success  
  })
  .catch(function (error) {
    // handle error
  })
  .finally(function () {
    // always do this
  });

我理解现在不推荐使用此语法,此代码应替换为

somethingThatReturnsAPromise.then(
  function (data) {
    // handle success  
  },
  function (error) {
    // handle error
  }
);

但是在使用这种新语法时,我应该把以前在finally中的代码放在哪里,即在承诺解决(成功)和拒绝(失败)时执行的代码?

2 个答案:

答案 0 :(得分:0)

如果您想以任何方式使用then,您可以为成功和错误承诺处理程序提供处理程序:

function always() {
    // Do whatever either it fails or succeeds
}

somethingThatReturnsAPromise.then(always, always).then(function(data) {

}, function(error) {

});

答案 1 :(得分:0)

第一:我没有找到任何与official docs中弃用的任何(与Promise相关)方法的内容。

第二名:finallythen(cb, cb)更复杂,因为它没有捕获错误,并且没有传播回调的结果,但是如果你返回一个承诺,等待这个承诺解决,直到它继续传播当前值。

像这样:

function _finally(promise, callback) {
    var handleValue = isError => value => $q((resolve, reject) => {
        //call your callback
        //if this throws, propagate the Error
        var w = typeof callback === "function" && callback();

        //prepare to push the current value/error
        var fn = isError?
            () => reject(value):
            () => resolve(value);

        //check wether your callback has returned sth. Promise-like
        if(w && typeof w.then === "function"){
            //then we'll wait for this to resolve, 
            //before we continue propagating the current value/error
            w.then(fn, fn);
        }else{
            //otherwise propagate the current value/error emmediately
            fn();
        }
    });

    return $q.resolve(promise).then(
        handleValue(false),
        handleValue(true)
    );
}

我编写此代码只是为了让您了解finally所做的事情。 Angular的实现更顺畅,所以坚持下去。

我认为没有理由认为catchfinally已被弃用或将会被弃用。