javascript – 在节点js失败后重试承诺自己

前端之家收集整理的这篇文章主要介绍了javascript – 在节点js失败后重试承诺自己前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我想在承诺中重试我的请求.如果我总是将401错误作为循环,我想启动刷新:(如果我有刷新循环的401循环,直到200)

我试过这个:

  1. const request = require('request');
  2. let conf = require('../conf');
  3.  
  4. let core_service = require('coreService');
  5.  
  6. let self = module.exports = {
  7. get_count_questions: function() {
  8. return new Promise((resolve,reject) => {
  9. request({
  10. method: 'GET',uri: 'http://api/count-questions',auth: {
  11. 'bearer': conf.token
  12. },json: true
  13. },function (error,response,body) {
  14. if (!error && response.statusCode === 200) {
  15. resolve(body);
  16. } else if (!error && response.statusCode === 401) {
  17. core_service.refreshToken().then((data) => {
  18. console.log('token refresh');
  19. return self.get_count_questions();
  20. })
  21. } else {
  22. reject(error);
  23. }
  24. })
  25. });
  26. }
  27. };

我试过’self.get_count_questions();’没有回报,但它不起作用.我没有错误消息,只是我的应用程序冻结.

我在我的console.log中看到“令牌刷新”,但在我的应用程序冻结之后……

Edit

修改了它,它更好但刷新令牌非常慢.就在401之前,我的应用停止了,大约1分40秒后,运行:

  1. else if (!error && response.statusCode === 401) {
  2. console.log('need refresh token');
  3. core_service.refreshToken()
  4. .then((response) => {
  5. console.log(response);
  6. resolve(self.get_count_questions())
  7. } );
  8. }

我的refreshToken函数

  1. refreshToken: function () {
  2. return new Promise((resolve,reject) => {
  3. request({
  4. method: 'GET',uri : 'http://api/refresh',auth : {
  5. 'bearer': conf.token
  6. },json : true
  7. },body) {
  8. console.log('=====> refresh token <======');
  9. conf.token = body.data;
  10. console.log('new Token');
  11. console.log('=====> end refresh token <======');
  12. if (!error && response.statusCode === 200) {
  13. resolve('Refresh token successful');
  14. } else {
  15. reject('Error refresh');
  16. }
  17. })
  18. });
  19. }

如果我在每个请求上刷新我的令牌,我有一个问题:

  1. if (!error && response.statusCode === 200) {
  2. core_service.refreshToken().then((data)=> {
  3. resolve(body);
  4. });
  5.  
  6. }

解决方法

您必须解决返回的承诺.当您使用承诺解决时,基本上说,用该承诺的结果完成此承诺.
  1. var prom = function() {
  2. return new Promise((resolve,reject) => {
  3. console.log('request start')
  4. setTimeout(() => {
  5. console.log('request finish')
  6. let ran = Math.random();
  7.  
  8. if (ran < 0.1)
  9. resolve('success');
  10.  
  11. else if (ran >= 0.1 && ran < 0.98)
  12. setTimeout(() => {
  13. console.log('retry');
  14. resolve(prom());
  15. },500);
  16.  
  17. else
  18. reject('error');
  19.  
  20. },500);
  21. });
  22. };
  23.  
  24. prom().then(console.log.bind(console),console.log.bind(console));

所以你应该更新你的else if if block:

  1. else if (!error && response.statusCode === 401) {
  2. console.log('need refresh token');
  3. core_service.refreshToken()
  4. .then(() => resolve(self.get_count_questions()));
  5. }

猜你在找的JavaScript相关文章