Javascript承诺:如何处理API调用中的令牌过期?

Javascript承诺:如何处理API调用中的令牌过期?,javascript,promise,Javascript,Promise,当我从API接收到令牌过期的错误时,我希望能够重新发出一个新令牌,并在用户感觉不到任何差异的情况下重复第一次发送的请求。有没有一种方法可以优雅地处理这个用例 function relogin(userInfo) { return Q.Promise(function (resolve, reject) { // ... }); } function makeTransaction(token, options) { dataOperations.make

当我从API接收到令牌过期的错误时,我希望能够重新发出一个新令牌,并在用户感觉不到任何差异的情况下重复第一次发送的请求。有没有一种方法可以优雅地处理这个用例

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上无限循环。。。将要添加最大重试次数。