关于fetchAccessToken()方法的问题

来源:

杨洋1989

2016-08-21

老师在构造fetchAccessToken()方法时,前半部分这段代码:

if(this.access_token && this.expires_in){
		if(this.isValidAccessToken(this)){
			return Promise.resolve(this);
		}
	}

在条件成立时可以令fetchAccessToken()方法返回一个promise对象,但是后半部分代码:

this.getAccessToken()
		.then(function(data){
			try{
				data = JSON.parse(data); //从外部文件获取的数据都是字符串格式,所以要先转为对象
			}
			catch(e){
				return that.updateAccessToken();
			}
			if (that.isValidAccessToken(data)){
				
				return Promise.resolve(data);
			}
			else{
				return that.updateAccessToken();
			}
		})
		.then(function(data){
			console.log('accessToken已更新或者确认可用')
			that.access_token = data.access_token;
			that.expires_in = data.expires_in;
			that.saveAccessToken(data);
			return Promise.resolve(data);
		})

却不能使fetchAccessToken()返回promise对象,导致后期在uploadMaterial()方法内部调用时无then方法。

应该在第二部分代码前加个 return

我的分析是否正确

另外:每次服务器处理一个新的请求时,所有代码应该生成一个新的上下文环境吧?那么为什么要在fetchAccessToken()方法中有上面所示的第一部分代码呢?因为每次处理一个新的请求时,就会重新执行一次fetchAccessToken(),此时access_token属性还未挂载到this对象上,那么对其适用性进行验证是否多余?

写回答

1回答

Scott

2016-08-21

是的,你的分析非常正确,你是第一个顺利把这个坑才明白的同学,表扬!

另外,这里 token 真实的生产环境,会保存在  redis, mongodb,或者 json 文件中去维护,每一次都去读写,课程中讲解部分暂时存在 this 里面,减少实例中频繁的读写 token 次数

0
1
杨洋1989
谢谢老师
2016-08-22
共1条回复

7天搞定Node.js微信公众号

Koa框架、ES2015新特性、MongoDB,开发微信公众号

1742 学习 · 787 问题

查看课程