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

我想重申我的要求。 我想启动我的刷新,如果我总是有401错误作为循环:(如果我有401循环刷新,直到200)

我试过这个:

const request = require('request'); let conf = require('../conf'); let core_service = require('coreService'); let self = module.exports = { get_count_questions: function() { return new Promise((resolve, reject) => { request({ method: 'GET', uri: 'http://api/count-questions', auth: { 'bearer': conf.token }, json: true }, function (error, response, body) { if (!error && response.statusCode === 200) { resolve(body); } else if (!error && response.statusCode === 401) { core_service.refreshToken().then((data) => { console.log('token refresh'); return self.get_count_questions(); }) } else { reject(error); } }) }); } }; 

我试着用'self.get_count_questions();' 没有回报,但这是行不通的。 我没有错误信息,只是我的应用程序冻结。

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

编辑

我修改了这个,它更好,但刷新令牌非常缓慢。 在401之前,我的应用程序停止,约1分40秒后运行:

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

我的refreshToken函数:

 refreshToken: function () { return new Promise((resolve, reject) => { request({ method: 'GET', uri : 'http://api/refresh', auth : { 'bearer': conf.token }, json : true }, function (error, response, body) { console.log('=====> refresh token <======'); conf.token = body.data; console.log('new Token'); console.log('=====> end refresh token <======'); if (!error && response.statusCode === 200) { resolve('Refresh token successful'); } else { reject('Error refresh'); } }) }); } 

在这里输入图像描述

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

 if (!error && response.statusCode === 200) { core_service.refreshToken().then((data)=> { resolve(body); }); } 

在这里输入图像描述

你必须解决返回的承诺。 当你解决使用承诺时,你基本上说,用这个承诺的结果来完成这个承诺。

 var prom = function() { return new Promise((resolve, reject) => { console.log('request start') setTimeout(() => { console.log('request finish') let ran = Math.random(); if (ran < 0.1) resolve('success'); else if (ran >= 0.1 && ran < 0.98) setTimeout(() => { console.log('retry'); resolve(prom()); }, 500); else reject('error'); }, 500); }); }; prom().then(console.log.bind(console), console.log.bind(console)); 

你正在做一个recursion调用,但你实际上从来没有做出任何承诺。 因此,你原来的承诺永远不会解决。

你需要从recursion调用中传递promise(to refreshToken().then() )来resolve()

现在你差不多了。

然而:

 return core_service.refreshToken() .then(self.get_count_questions); 

你正在返回的request()callback; 那个返回值没有被使用。

相反,你需要通过将它传递给你最初的resolve()函数来解决你原来对promise的承诺:

 resolve(core_service.refreshToken().then(...)); 

我知道这不是最佳解决scheme,但可能有帮助

 const request = require('request'); let conf = require('../conf'); let core_service = require('coreService'); let self = module.exports = { get_count_questions: function() { return new Promise((resolve, reject) => { request({ method: 'GET', uri: 'http://api/count-questions', auth: { 'bearer': conf.token }, json: true }, function (error, response, body) { try{ if (!error && response.statusCode === 200) { resolve(body); } else if (!error && response.statusCode === 401) { throw new Error(response.statusCode); } else { reject(error); } }catch(exc){if(exc === 401){ core_service.refreshToken().then((data) => { console.log('token refresh'); return self.get_count_questions(); }) } } }) }); } }; 

重试请求后,您需要调用最初的parsing/拒绝function:

 let self = module.exports = { get_count_questions: function() { return new Promise((resolve, reject) => { request({ method: 'GET', uri: 'http://api/count-questions', auth: { 'bearer': conf.token }, json: true }, function (error, response, body) { if (!error && response.statusCode === 200) { resolve(body); } else if (!error && response.statusCode === 401) { core_service.refreshToken().then((data) => { console.log('token refresh'); self.get_count_questions().then((data) => { // call initial resolve function resolve(data); }).catch((error) => { // call initial reject function reject(error); }); }).catch((error) => { // reject if refreshToken fails reject(error); }); } else { reject(error); } }) }); } }; 

你还必须确定,第二个调用实际上是解决/拒绝,而不是在另一个401中着陆。因为否则你有一个无限的recursion。