module.exports如何返回异步结果?

at.js

var main = {
    h: () => {
        return 1 + 1;
    },
    get: ()=> {
        client.get('access_token', (err, reply) => {
            // reply is null when the key is missing
            //console.log(reply);
            if (!reply) {//为空,更新access_token
                //console.log("refresh")
                request(url, function (error, response, body) {
                    var ms = JSON.parse(body)
                    client.set('access_token', ms.access_token)
                    client.expire('access_token', ms.expires_in)
                });
                return ms.access_token
            }
            else {
                return reply
            }


        });

    }
}
module.exports = main;

main.js

var access_token=require('./at');
console.log(access_token.h())
console.log("___")
console.log(access_token.get())

node main
输出的结果是
2
————————
undefined

请问要怎么修改get,使得在main中调用时达到调用h时直接输出结果?

阅读 7k
3 个回答

使用回调函数
或者使用 async函数 在main.js使用await access_token.get()
题主的意思应该是不想重复请求接口,可以采取类似的方法,设置一个变量保存,存在的话就不请求直接返回,不存在的话再去请求接口

a.js

let token = null;

const getTokenFromServer = async function () {
  return new Promise((resolve,reject)=>{
    setTimeout(()=>{
      console.log('get token from server success');
      token = 'i am token';
      resolve(token);
    },1000)
  })
};

const getToken = async function () {
  return new Promise(async(resolve,reject)=>{
    if(token){
      resolve(token);
    }else {
      let myToken =  await getTokenFromServer();
      token = myToken;
      resolve(token);
    }
  })
}

module.exports = getToken

main.js


const getToken = require('./a');

!(async function () {

  let start = Date.now();
  console.log(await getToken());
  console.log(`第一次获取 花费 ${Date.now() - start} ms`);

  start = Date.now();
  console.log(await getToken());
  console.log(`第二次获取 花费 ${Date.now() - start} ms`);

  start = Date.now();
  console.log(await getToken());
  console.log(`第三次获取 花费 ${Date.now() - start} ms`);

})()

//打印结果
get token from server success
i am token
第一次获取 花费 1023 ms
i am token
第二次获取 花费 0 ms
i am token
第三次获取 花费 0 ms

对于异步函数,你应该通过回调函数来返回结果,而不是 return。

get: (callback)=> {
        client.get('access_token', (err, reply) => {
            // reply is null when the key is missing
            //console.log(reply);
            if (!reply) {//为空,更新access_token
                //console.log("refresh")
                request(url, function (error, response, body) {
                    var ms = JSON.parse(body)
                    client.set('access_token', ms.access_token)
                    client.expire('access_token', ms.expires_in)
                });
                callback(ms.access_token)
            }
            else {
                callback(reply)
            }


        });

get 参数 加 callback

get: (callback )=> {
    client.get('access_token', (err, reply) => {
        // reply is null when the key is missing
        //console.log(reply);
        if (!reply) {//为空,更新access_token
            //console.log("refresh")
            request(url, function (error, response, body) {
                var ms = JSON.parse(body)
                client.set('access_token', ms.access_token)
                client.expire('access_token', ms.expires_in)
            });
            callback(ms.access_token)
        }
        else {
            callback(reply)
        }

    });

}

获得

access_token.get((data)=>{
        console.log(data);
    });

当然,最好加上error

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题