Javascript 如何在Nodejs中从内部函数返回值

Javascript 如何在Nodejs中从内部函数返回值,javascript,node.js,Javascript,Node.js,我有使用请求库从url获取身份验证令牌的Nodejs代码 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,

我有使用请求库从url获取身份验证令牌的Nodejs代码

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_标记
,作为另一个函数中的参数使用。但是,它显示未定义


我在网上查到使用
cb
,但是,我不知道它是如何工作的。我确实希望返回值,而不使用
cb
。有什么帮助吗?

只有在服务器返回响应后才会执行回调。到那时,您的函数将已经执行

因为您的代码是异步的,所以您需要一种只在从服务器返回响应时才返回响应的方法

您可以使用用于该任务的

下面是一个关于如何在您的特定情况下解决此问题的示例。使用承诺构造函数返回一个承诺,该承诺在调用内部回调时解析/拒绝

然后,您只需将
.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
这样从承诺中获取值,只需确保在标记为
async
的函数中使用
await

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

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

只有从服务器返回响应后,才会执行回调。到那时,您的函数将已经执行

因为您的代码是异步的,所以您需要一种只在从服务器返回响应时才返回响应的方法

您可以使用用于该任务的

下面是一个关于如何在您的特定情况下解决此问题的示例。使用承诺构造函数返回一个承诺,该承诺在调用内部回调时解析/拒绝

然后,您只需将
.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
这样从承诺中获取值,只需确保在标记为
async
的函数中使用
await

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

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

cb
简单的意思是
回调
-它的工作原理与任何其他回调都类似。我可以在不使用cb的情况下执行它吗?我建议从函数返回一个承诺,并在内部回调中解决它,如果可以的话,我可以用一个例子来提供答案help@jo_va或者您可以参考建议的副本,因为它几乎涵盖了JavaScript中异步代码的所有可能主题。
cb
只是指
callback
——它的工作原理与任何其他回调的工作原理类似。我可以不使用cb?我建议从函数中返回一个承诺,并在内部回调中解决它,如果可以的话,我可以用一个例子给出答案help@jo_va或者您可以参考建议的副本,因为它几乎涵盖了JavaScript中异步代码的所有可能主题,我不知道我们必须使用Promise和callback,我只想像python那样返回值。有没有办法不使用承诺和承诺就返回callback@Akira,当服务器返回响应时,您的回调将在稍后执行。因此,代码本质上是异步的。您的函数将在服务器响应到来之前执行完毕,因此您需要一种只在响应返回后执行代码的方法,您可以使用一个承诺。同时使用
resolve
reject
时,最好提供一行代码来负责处理第二个响应,例如:
get\u-auth\u-token().then(console.log).catch(console.log)
get\u-auth\u-token().then(result=>{console.log(result)}.catch(error=>{console.log(error)})
在这种情况下,这两个结果是相同的。为了避免混淆,请坚持第二个示例(第一个示例用于OP的进一步研究;)。@Akira,看一看-答案描述了如何使用@jo提供的示例分配
promise
/
async/await
的结果_va@Akira,我建议你读一些关于承诺的材料。这已经用
解释过了。然后
异步/等待
,看看我的更新答案。我对Nodejs非常陌生,我不知道我们必须使用承诺和回调,我只想像python那样简单地返回值。有没有办法不使用承诺和承诺就返回callback@Akira,当服务器返回响应时,您的回调将在稍后执行。因此,代码本质上是异步的。您的函数将在服务器响应到来之前执行完毕,因此您需要一种只在响应返回后执行代码的方法,您可以使用一个承诺。同时使用
resolve
reject
时,最好提供一行代码来负责处理第二个响应,例如:
get\u-auth\u-token().then(console.log).catch(console.log)
get\u-auth\u-token().then(result=>{console.log(result)}.catch(error=>{console.log(error)})
在这种情况下,这两个结果是相同的。为了避免混淆,请坚持第二个示例(第一个示例用于OP的进一步研究;)。@Akira,看一看-答案描述了如何使用@jo提供的示例分配
promise
/
async/await
的结果_va@Akira,我建议你读一些关于承诺的材料。这已经用
解释过了。然后
异步/等待
,请参阅我的更新答案。