Javascript承诺:如何处理API调用中的令牌过期?
当我从API接收到令牌过期的错误时,我希望能够重新发出一个新令牌,并在用户感觉不到任何差异的情况下重复第一次发送的请求。有没有一种方法可以优雅地处理这个用例Javascript承诺:如何处理API调用中的令牌过期?,javascript,promise,Javascript,Promise,当我从API接收到令牌过期的错误时,我希望能够重新发出一个新令牌,并在用户感觉不到任何差异的情况下重复第一次发送的请求。有没有一种方法可以优雅地处理这个用例 function relogin(userInfo) { return Q.Promise(function (resolve, reject) { // ... }); } function makeTransaction(token, options) { dataOperations.make
function relogin(userInfo) {
return Q.Promise(function (resolve, reject) {
// ...
});
}
function makeTransaction(token, options) {
dataOperations.makeTransaction(token, options).then(function (result) {
// notify ui - new data yey!
}).catch(function (err) {
if (err.code === 304) {
relogin.then(function (token) {
makeTransaction(token, options);
}).catch(function (err) {
// notify UI - problems with server
});
}
});
}
代码看起来已经很好了。你的问题具体是什么?如果您有许多事务,并且担心代码重复,并且多次检查HTTP 304,则可以将事务包装在处理程序中:
function relogin(userInfo) {
return Q.Promise(function(resolve, reject) {
// ...
});
}
function myTask(params) {
return Q.Promise(function(resolve, reject) {
// ...
});
}
function doTask(fn, context, params) {
return fn.apply(context, params).then(function(results) {
return results;
}).catch(function(err) {
if (err.code === 304) {
return relogin({}).then(doTask(fn, context, params));
}
else {
return err;
}
});
}
// ...
$("#foo").on("click", function(e) {
doTask(myTask, this, params).done(function(results) {
alert("all done");
}).catch(function(err) {
alert(err);
});
});
仅供参考,明确要求第三方图书馆提供某些东西在这里被认为是离题的。但是,你可以展示到目前为止你做了什么,描述你在哪里遇到了困难,并询问如何解决问题。知道这一点很好。我阅读了“如何提出一个好的问题?”手册,以便在提出问题时回忆起最佳实践。谢谢。这可以在304上无限循环。。。将要添加最大重试次数。