如何从Node.js中的内部函数返回值

时间:2019-04-30 21:10:08

标签: javascript node.js

我有使用请求库的Node.js代码来从URL获取身份验证令牌。

Vue.set

我想返回var request = require("request") const wellish_dev_url = "https://dev.wellish.com" function get_auth_token(){ const api_end_point = wellish_dev_url + "/api/v1/auth" var options = { url: api_end_point, headers: {"Content-Type": "application/json"}, auth: { 'user': 'admin', 'pass': 'password'} } var r = request.get(options, function(error, response, body){ if(!error && response.statusCode==200){ var token = JSON.parse(body) var auth_token = token["data"][0]["accessToken"] // console.log(auth_token) return auth_token } else{ console.log("Code : " + response.statusCode) console.log("error : " + error) console.log('body : ' + body) } }) } // get_auth_token() var auth_token_new = get_auth_token() console.log(auth_token_new) 用作另一个函数的参数。但是,它显示未定义。

我在线查找要使用auth_token,但是我不知道它是如何工作的。我真的很想在不使用cb的情况下返回值。有帮助吗?

1 个答案:

答案 0 :(得分:2)

仅当响应从服务器返回时,才执行您的回调。到那时,您的功能将已经执行。

由于代码是异步的,因此您需要一种仅在从服务器获得响应时才返回响应的方法。

您可以将Promise用于该任务。

这里是一个如何解决您的特殊情况的示例。使用Promise构造函数返回一个Promise,当您的内部回调被调用时,该Promise会解析/拒绝。

然后,您只需要将.then()链接到函数调用即可获取令牌:

...

function get_auth_token() {
    const  api_end_point = ...
    const options = ...

    return new Promise((resolve, reject) => {
        var r = request.get(options, (error, response, body) => {
            if (!error && response.statusCode == 200){
                var token = JSON.parse(body)
                var auth_token = token["data"][0]["accessToken"]
                resolve(auth_token)
            } else {
                console.log("Code : " + response.statusCode)
                console.log("error : " + error)
                console.log('body : ' + body)
                reject(error)
            }
        })
    });
}

get_auth_token()
    .then(token => console.log(token))
    .catch(error => console.error(error));

您还可以使用await这样从Promise中获取值,只需确保在标记为await的函数中使用async

async function parent_function() {
    function get_auth_token() { ... }

    try {
        const token = await get_auth_token();
        console.log(token);
    } catch (error) {
        console.log(error);
    }
}