2016-11-19 21 views
0

我有一點長登錄過程,它依賴於3個API調用,看起來像這樣的時刻:最外層的.catch()適用於所有鏈接/嵌套promisses嗎?

export const authenticationSignIn = (email, password) => 
    (dispatch) => { 
    dispatch({ type: AUTHENTICATION_REQUEST }); 
    apiAccountStatus(email, password) 
    .then(({ data }) => { 
     const status = data.status; 
     if (status === 'ACCOUNT_CREATED') { 
     apiSignIn(email, password) 
     .then(({ data: sessionData }) => { 
      apiIndexAccounts() 
      .then(({ data: accountsData }) => { 
      dispatch({ type: AUTHENTICATION_SUCCESS }); 
      window.router.transitionTo('/dashboard/home'); 
      }); 
     }); 
     } else if (status === 'SOMETHING ELSE') { 
     // TODO: HANDLE SOMETHING ELSE 
     } 
    }) 
    .catch(({ response }) => { 
     dispatch({ type: AUTHENTICATION_FAILURE }); 
     dispatch(notificationShow('ERROR', response.data.type)); 
    }); 
    }; 

正如你可以看到這個功能是安靜冗長,但每個嵌套API調用依賴於數據從前一個返回,我試圖儘可能清理它(調度位是特定的,但這些基本上是火的任何傳遞)。最後你會看到一條catch聲明,我的問題是這個聲明是否適用於所有的promisses或只有apiAccountStatus

回答

2

最後你會看到一個catch語句,我的問題是這個catch語句是否適用於所有的promise?

不,它僅適用於外的承諾,由then調用返回的一個。這需要被拒絕,catch回調被激活。爲了得到這個承諾被拒絕,要麼apiAccountStatus(…)必須拒絕,要麼then回調必須拋出異常或返回承諾,將被拒絕

這最後一件事是你錯過了 - 你在then回調中創造了更多的承諾,但你不是return他們,以便他們不會鏈。你必須做

export function authenticationSignIn(email, password) { 
    return (dispatch) => { 
    dispatch({ type: AUTHENTICATION_REQUEST }); 
    apiAccountStatus(email, password) 
    .then(({data: {status}}) => { 
     if (status === 'ACCOUNT_CREATED') { 
     return apiSignIn(email, password) 
//  ^^^^^^ 
     .then(({ data: sessionData }) => { 
      return apiIndexAccounts() 
//  ^^^^^^ 
      .then(({ data: accountsData }) => { 
      dispatch({ type: AUTHENTICATION_SUCCESS }); 
      window.router.transitionTo('/dashboard/home'); 
      }); 
     }); 
     } else if (status === 'SOMETHING ELSE') { 
     // TODO: HANDLE SOMETHING ELSE 
     } 
    }) 
    .catch(({ response }) => { 
     dispatch({ type: AUTHENTICATION_FAILURE }); 
     dispatch(notificationShow('ERROR', response.data.type)); 
    }); 
    }; 
}