0

Угловая2 имеет очень полезный механизм для обнаружения ошибок для цепных обещаний. Тем не менее, обычный случай (по крайней мере для меня) - это обещания, вызванные из обработчика разрешения предыдущего. Это связано с необходимостью обработки информации до начала следующего обещания. Например:ловли ошибки в машинописных обещаниях

this.d("facebookOAuthLogin() - starts"); 
this.fbProvider.login().then(
    (loginResponse: { status: string, authResponse: any, accessToken: string, expiresIn: string, session_key: string, sig: string, userID: string }) => 
    { 
     this.d("facebookOAuthLogin() - fbProvider.login() succeeded"); 
     Config.config.sessionToken = loginResponse.authResponse.accessToken; 
     this.fbProvider.getCurrentUserProfile().then(
      (profileData : { email: string, name: string }) => 
      { 
       this.d("facebookOAuthLogin() - fbProvider.getCurrentUserProfile() succeeded"); 
       Config.config.user_email = profileData.email; 
       Config.config.user_name = profileData.name; 
       this.fbProvider.getUserPicture().then(
        (pictureData : { data:{ is_silhouette: boolean, url: string, width: number, height: number } }) => 
         { 
          this.d("facebookOAuthLogin() - fbProvider.getUserPicture() succeeded"); 
          // this.facebook_picture_url = pictureData.data.url; 
          // this.facebook_picture_is_silhouette = pictureData.data.is_silhouette; 
          if(pictureData.data.is_silhouette || pictureData.data.url == null) 
          { 
           this.d("facebookOAuthLogin() - pictureData.data.url == null"); 
           Config.config.jpegBase64Data = null; 
           this.afterFacebookLogin(); 
          } 
          else 
          { 
           this.d("facebookOAuthLogin() - pictureData.data.url != null"); 
           ImageStore.readToData(pictureData.data.url).then(
            dataBase64 => 
            { 
             this.d("facebookOAuthLogin() - facebook picture read successfully"); 

Итак, вопрос - Если я хочу, чтобы поймать все ошибки во всех обработчиках самым простым способом (давайте оставим вне тип исключений - Допустим, мне просто нужно войти ошибка и отчет. Любая ошибка - без обработки их отдельно.)

Из чего я понимаю, что попытка try {} catch (err) вокруг кода не будет ловить ошибки, выброшенные из обработчика Promise.

С кодом выше - Нужно ли добавить попытку/улов в каждом обработчике Promise, или я могу использовать внешний метод()()().

ответ

4

Один из способов цепи обещаний вернуть обещание в then функции, например:

method1() 
    .then(response1 => { 
    // ... do something 
    return method2(response1); 
    }) 
    .then(response2 => { 
    // ... do something 
    return method3(response3); 
    }) 
    .catch(error => handleError(error)) 
    .finally(() => handleFinally()) 

Когда все обещания успешно разрешены, как и ожидалось, все методы называются последовательно (method1 -> method2 -> method3 -> handleFinally).

Когда одно обещание терпит неудачу, все последующие пропущены и вместо этого вызывается catch. Предполагая, что method2 терпит неудачу, у нас есть эта цепочка вызовов: method1 -> method2 -> handleError -> handleFinally.

Теперь предположим, что мы хотим, чтобы игнорировать ошибку в method2, мы можем добавить поймать заявление на этот призыв:

method1() 
    .then(response1 => { 
    // ... do something 
    return method2(response1) 
     .catch(error2 => silentlyHandleError(error2)); 
    }) 
    .then(response2 => { 
    // ... do something 
    return method3(response3); 
    }) 
    .catch(error => handleError(error)) 
    .finally(() => handleFinally()) 

Обратите внимание, что catch не должны быть размещены среди основной цепи обещаний. Следующий блок объясняет немного больше:

method1() 
    .then(response1 => { 
    // ... do something 
    return method2(response1); 
    }) 
    .catch(error => silentlyHandleError(error)) // catchs error1 and error2 
    .then(response2 => { 
    // ... do something 
    return method3(response3); 
    }) 
    .catch(error => handleError(error)) 
    .finally(() => handleFinally()) 
1

Пусть каждое обещание вернуть вложенное обещание, а верх обещания есть .catch (..)

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