我有一个promise函数,_checkCookie检查cookie并在找到时解析,如果没有找到则拒绝false。
该函数采用一个参数,即cookie名称。
我现在正尝试通过检查多个不同的Cookie来解析用户名。如同,检查cookie A,如果没有,检查cookie B等。
我坚持让checkCookie函数从它自己的catch语句中重新运行。有没有办法让checkCookie尝试每个潜在的cookie名称而不必在每个.catch()块中调用它?
potentialCookies = ['cookieA','cookieB','cookieC']
function _checkCookie(cookieName) {
return new Promise((resolve, reject) => {
const cname = `${cookieName}=`;
const ca = document.cookie.split(";");
for (let i = 0; i < ca.length; i++) {
let c = ca[i];
while (c.charAt(0) === " ") {
c = c.substring(1, c.length);
}
if (c.indexOf(cname) === 0) {
resolve(c.substring(cname.length, c.length));
}
}
reject(false)
});
}
这是我尝试失败的一个选项
_checkCookie("CookieA")
.catch(e => {
throw e
})
.catch(e => {
_checkCookie("CookieB")
console.warn(e, '2')
throw e
}).
catch(e => {
_checkCookie("CookieC")
console.warn(e, '3')
throw e
})
答案 0 :(得分:0)
您不想重新throw
原始错误并忽略_checkCookie
调用的结果。相反,返回你回来的承诺,以便链中的下一个函数等待它:
_checkCookie("CookieA")
.catch(e => {
console.warn(e, '2');
return _checkCookie("CookieB");
})
.catch(e => {
console.warn(e, '3');
return _checkCookie("CookieC");
});
答案 1 :(得分:-1)
您可以使用Promise.all()
来处理.then()
或.catch()
中的错误,以防止Promise.all()
到达.catch()
potentialCookies = ['cookieA','cookieB','cookieC']
function _checkCookie(cookieName) {
return new Promise((resolve, reject) => {
const cname = `${cookieName}=`;
const ca = document.cookie.split(";");
for (let i = 0; i < ca.length; i++) {
let c = ca[i];
while (c.charAt(0) === " ") {
c = c.substring(1, c.length);
}
if (c.indexOf(cname) === 0) {
resolve(c.substring(cname.length, c.length));
}
}
reject(false)
}).then(function(data) {
return data
}
// handle error
, function(error) {
console.error(error);
return error + " no cookie found"
});
}
Promise.all(potentialCookies.map(_checkCookie))
.then(function(results) {
console.log(results)
})