2017-08-01 178 views
1

我有一個簡單的功能來註銷(僅用於測試),並且我想在操作完成時通知用戶。首先想到的是用承諾來做到這一點。Redux返回承諾

我這樣試過,但是有些問題。我不太瞭解這些工作。我能夠這樣做嗎?還是會有更好的方法?

功能

logOut =() => { 
    this.props.logoutUser().then((passed) => { 
     if (passed) { 
      alert("You are now logged out!"); 
     } 
    }); 
}; 

註銷行動

export function logoutUser() { 
    return dispatch => { 
     new Promise(function (resolve, reject) { 
      dispatch(logout()).then((response) => { 
       return true; 
      }).catch((error) => { 
       return false; 
      }); 
     }); 
    } 
} 

function logout() { 
    return { 
     type: "LOGOUT" 
    } 
} 
+1

你的方法是正確的。確保你使用的是「thunk」中間件,並且你的thunk返回Promise。 –

+1

我應該有thunk工作,因爲我將其與包含「fetch」的其他操作一起使用。這一次我想不使用'fetch'來使用它:) –

+1

雖然這是同樣的方法,因爲'fetch'也返回一個Promise。如果你的thunk會返回Promise,你可以在組件中使用它('return new Promise ...')。 –

回答

2

與註銷功能問題

export function logoutUser() { 
    return dispatch => { 
     new Promise(function (resolve, reject) { 
      dispatch(logout()).then((response) => { 
       resolve(true); // changed 
      }).catch((error) => { 
       reject(error); // changed 
      }); 
     }); 
    } 
} 

你必須通過回調函數resolve爲成功,並且reject失敗。 請參閱本link

更新:其次,你必須使用thunk中間件,工作dispatchPromise對象:github

+0

我仍然收到錯誤「Uncaught TypeError:Can not read property'then'of undefined」:( –

+0

檢查更新後的答案.. –

0

,你也可以做到這一點與callback,像這樣 -

logOut =() => { 
    this.props.logoutUser(result => { 
    if (result.success) { 
     alert("You are now logged out!"); 
     return; 
    } 

    // Handle error 
    }); 
}; 

export function logoutUser(callback) { 
    logout() 
    .then(() => callback({ success: true })) 
    .catch(error => callback({ error })); 

    return dispatch => { 
    dispatch({ 
     type: "LOGOUT" 
    }); 
    }; 
} 

function logOut() { 
    // log out function that returns a promise 
}