用新的参数重试承诺

时间:2017-08-09 13:43:58

标签: javascript es6-promise

我有一个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
            })

2 个答案:

答案 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)
})