https://jsfiddle.net/oc5v4bs5/ < ==链接到代码
导出accToken
变量时,它显示未定义的值。为什么会出现这种情况?
//core modules
const OAuth2 = require('oauth').OAuth2;
//vars
const clientId = '<myClientId>';
const clientSecret = '<myClientSecret>';
let accToken;
const oauth2 = new OAuth2(
clientId,
clientSecret,
'https://accounts.spotify.com/',
null,
'api/token',
null);
//make gotAuth promise
const gotAuth = new Promise((resolve,reject)=>{
oauth2.getOAuthAccessToken('',{'grant_type':'client_credentials'},
(err, access_token, refresh_token,results)=>{
if(access_token){
resolve(access_token);
}else if(err){
reject(err);
}
});
});
gotAuth.then((val)=>{
accToken = val;
});
module.exports = accToken;
答案 0 :(得分:1)
您正在导出accToken
之前已设置其值。 oauth2.getOAuthAccessToken()
是异步的。这意味着它在模块初始化完成后以及执行module.exports = accToken;
语句之后的某个时间完成并调用其回调。因此,当您的exports语句运行时,尚未设置accToken
。
您需要导出promise并让调用者在promise上使用.then()
来获取值。只有当承诺解决时才是可用的价值。或者,您可以导出一个返回promise的方法,让调用者根据需要调用它,并仍然对返回的promise使用.then()
来访问该值。
module.exports = new Promise((resolve,reject)=>{
oauth2.getOAuthAccessToken('',{'grant_type':'client_credentials'},
(err, access_token, refresh_token,results)=>{
if(access_token){
resolve(access_token);
}else if(err){
reject(err);
}
});
});
然后,你在哪里使用它:
require('./token.js').then(token => {
// use token here
});