Javascript 回报承诺
我有一个简单的注销功能(只是为了测试),我想在操作完成时通知用户。首先想到的是用承诺做到这一点 我试过这样做,但有点不对劲。我不太明白这些是怎么工作的。我能这样做吗?还是有更好的方法 功能Javascript 回报承诺,javascript,reactjs,promise,redux,react-redux,Javascript,Reactjs,Promise,Redux,React Redux,我有一个简单的注销功能(只是为了测试),我想在操作完成时通知用户。首先想到的是用承诺做到这一点 我试过这样做,但有点不对劲。我不太明白这些是怎么工作的。我能这样做吗?还是有更好的方法 功能 logOut = () => { this.props.logoutUser().then((passed) => { if (passed) { alert("You are now logged out!"); } });
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"
}
}
注销操作
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"
}
}
注销功能出现问题
export function logoutUser() {
return dispatch => {
new Promise(function (resolve, reject) {
dispatch(logout()).then((response) => {
resolve(true); // changed
}).catch((error) => {
reject(error); // changed
});
});
}
}
您必须传递回调函数resolve
才能成功,传递reject
才能失败。
参考此
更新:其次,您必须使用
thunk
中间件,像Promise
对象那样执行dispatch
,您也可以使用回调
这样做-
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
}
你的方法是正确的。确保您正在使用
thunk
中间件,并且您的thunk返回了承诺。我应该让thunk工作,因为我将它用于包含“fetch”的其他操作。这次我想不使用“fetch”:)这是同样的方法,因为fetch
也会返回一个承诺。如果您的thunk将返回承诺,您将能够在组件中使用它(返回新承诺…
)。正如所写的logoutUser
是一个返回函数的函数,返回的函数返回未定义的。此外,您很可能会忘记新承诺(…)
以及所有那些正确/错误的业务。如代码所示,如果dispatch()
返回承诺,只需返回它即可。回到调用者,成功注销将使您沿着承诺的成功路径和失败路径返回错误路径。我仍然收到错误“Uncaught TypeError:无法读取未定义的属性'then”:(