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”:(