Promises 不等待解决或拒绝 - javascript - ReactJs
Promises does not wait resolve or reject - javascript - ReactJs
我使用 token 身份验证我的 React spa 应用程序。在我进行 CRUD 处理之前,我检查刷新令牌过期时间。如果刷新令牌有效,没问题,但如果无效,我会在 crud 之前发送旧的刷新令牌并从服务器接收新的刷新和访问令牌。
没问题,直到这一点。
问题是刷新机制没有等待服务器的响应就完成了。
currentUser 存储令牌值。
我检查令牌的空控件,然后如果过期时间无效,我发送旧的刷新令牌。
此时函数returns无需等待authenticationService.createAccessTokenByRefreshToken函数的响应。函数必须等待此函数,因为如果访问令牌无效,我需要新的。
为什么函数没有等待就结束了?
export function authHeader() {
var authorization = {
Authorization: ''
};
var currentUser = authenticationService.currentUserValue;
if (currentUser && currentUser.token) {
const refreshToken = currentUser.refreshToken;
const expiration = currentUser.expiration;
var moment = require('moment');
var now = moment();
if (moment(now).isAfter(expiration)) {
authenticationService.createAccessTokenByRefreshToken(refreshToken).then((res) => {
authorization.Authorization = `Bearer ${res.data.token}`;
return Promise.resolve(authorization);
});
}
else {
authorization.Authorization = `Bearer ${currentUser.token}`;
return Promise.resolve(authorization);
}
//return { Authorization: `Bearer ${currentUser.token}` };
} else {
return Promise.reject(authorization);
}
}
if (moment(now).isAfter(expiration)) {
authenticationService.createAccessTokenByRefreshToken(refreshToken).then((res) => {
authorization.Authorization = `Bearer ${res.data.token}`;
return Promise.resolve(authorization);
});
}
此代码块需要 return 语句。目前它隐式 returning 未定义。另外,一件小事:如果你在 .then
中,你不需要做 Promise.resolve(authorization),
,你可以 return authorization
。 .then
为您创造新的承诺。
if (moment(now).isAfter(expiration)) {
return authenticationService.createAccessTokenByRefreshToken(refreshToken)
.then((res) => {
authorization.Authorization = `Bearer ${res.data.token}`;
return authorization;
});
}
请开始使用 async
await
。它使您的生活更轻松,代码可读性更强,错误更少。让我知道以下内容是否适合您:)
const moment = require("moment");
const authHeader = async () => {
try {
const authorization = {
Authorization: ""
};
const currentUser = authenticationService.currentUserValue;
if (currentUser && currentUser.token) {
const refreshToken = currentUser.refreshToken;
const expiration = currentUser.expiration;
const now = moment();
if (moment(now).isAfter(expiration)) {
const authResponse = await authenticationService.createAccessTokenByRefreshToken(
refreshToken
);
authorization.Authorization = `Bearer ${authResponse.data.token}`;
} else {
authorization.Authorization = `Bearer ${currentUser.token}`;
}
}
return authorization;
} catch (err) {
return err;
}
};
export default authHeader;
我使用 token 身份验证我的 React spa 应用程序。在我进行 CRUD 处理之前,我检查刷新令牌过期时间。如果刷新令牌有效,没问题,但如果无效,我会在 crud 之前发送旧的刷新令牌并从服务器接收新的刷新和访问令牌。 没问题,直到这一点。
问题是刷新机制没有等待服务器的响应就完成了。
currentUser 存储令牌值。 我检查令牌的空控件,然后如果过期时间无效,我发送旧的刷新令牌。
此时函数returns无需等待authenticationService.createAccessTokenByRefreshToken函数的响应。函数必须等待此函数,因为如果访问令牌无效,我需要新的。
为什么函数没有等待就结束了?
export function authHeader() {
var authorization = {
Authorization: ''
};
var currentUser = authenticationService.currentUserValue;
if (currentUser && currentUser.token) {
const refreshToken = currentUser.refreshToken;
const expiration = currentUser.expiration;
var moment = require('moment');
var now = moment();
if (moment(now).isAfter(expiration)) {
authenticationService.createAccessTokenByRefreshToken(refreshToken).then((res) => {
authorization.Authorization = `Bearer ${res.data.token}`;
return Promise.resolve(authorization);
});
}
else {
authorization.Authorization = `Bearer ${currentUser.token}`;
return Promise.resolve(authorization);
}
//return { Authorization: `Bearer ${currentUser.token}` };
} else {
return Promise.reject(authorization);
}
}
if (moment(now).isAfter(expiration)) {
authenticationService.createAccessTokenByRefreshToken(refreshToken).then((res) => {
authorization.Authorization = `Bearer ${res.data.token}`;
return Promise.resolve(authorization);
});
}
此代码块需要 return 语句。目前它隐式 returning 未定义。另外,一件小事:如果你在 .then
中,你不需要做 Promise.resolve(authorization),
,你可以 return authorization
。 .then
为您创造新的承诺。
if (moment(now).isAfter(expiration)) {
return authenticationService.createAccessTokenByRefreshToken(refreshToken)
.then((res) => {
authorization.Authorization = `Bearer ${res.data.token}`;
return authorization;
});
}
请开始使用 async
await
。它使您的生活更轻松,代码可读性更强,错误更少。让我知道以下内容是否适合您:)
const moment = require("moment");
const authHeader = async () => {
try {
const authorization = {
Authorization: ""
};
const currentUser = authenticationService.currentUserValue;
if (currentUser && currentUser.token) {
const refreshToken = currentUser.refreshToken;
const expiration = currentUser.expiration;
const now = moment();
if (moment(now).isAfter(expiration)) {
const authResponse = await authenticationService.createAccessTokenByRefreshToken(
refreshToken
);
authorization.Authorization = `Bearer ${authResponse.data.token}`;
} else {
authorization.Authorization = `Bearer ${currentUser.token}`;
}
}
return authorization;
} catch (err) {
return err;
}
};
export default authHeader;