来自promise的值未导出到另一个模块

时间:2017-12-24 08:00:49

标签: javascript node.js ecmascript-6 es6-promise

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;

1 个答案:

答案 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
});