2017-08-01 180 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 
}