2016-08-05 2 views
-2

У меня есть некоторый код, который обрабатывает угловые обещания как этотмигрирует код осуждается обещание-обращение

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 при использовании этого нового синтаксиса, то есть код, который выполняется как после того, как обещание будет разрешено (успешно), так и отклонено (сбой)?

+0

Где вы это слышали? –

+1

Я был бы удивлен, если бы поймал и, наконец, устарел – zoom

+0

Тем не менее, catch (f) = then (null, f) и, наконец, (f) = then (f, f) – zoom

ответ

0

Если вы хотите, чтобы пойти с then либо образом, вы можете предоставить обработчик для обоих успеха и обещают ошибки обработчиков:

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

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

}, function(error) { 

}); 
0

первый: я не нашел ничего о каких-либо (Promise связанных) методом устаревшие в official docs.

2: finally является более сложным, чем then(cb, cb), так как он не ломает ошибки и не распространяет результаты вашего обратного вызова, но если вы вернете обещание, он ждет, пока это обещание разрешится, пока оно продолжает распространять текущее значение.

Sth так:

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) 
    ); 
} 

Я написал этот код только, чтобы дать вам то, что implession finally делает. Угловая реализация более гладкая, поэтому придерживайтесь этого.

Я не вижу причин думать, что catch или finally устарели или когда-либо будут.

Смежные вопросы