如何等待异步函数在nodejs中完成它的执行

时间:2018-02-17 16:17:12

标签: node.js asynchronous

我有一个函数返回一个从nodejs中的http GET请求获取的值。如何等待异步请求函数完成并从生成请求的函数返回结果。 我在npm中检查了异步库,但这并没有解决我的问题。 谢谢你的帮助!!

 function daemonGetNodeStatus(kubeURL, nodeName) {
    console.log(nodeName);
    var request = require("request");
    var options = {
        method: 'GET',
        url: kubeURL+'/api/v1/nodes/'+nodeName+'/status',
        headers: {
            'Cache-Control': 'no-cache',
            'Authorization': 'Bearer '+constants.accessToken
        }
    };

    request(options, function(error, response, body) {
        if (error)
            throw new Error(error);
        var bodyJSON = JSON.parse(body);

        var result = [];

        var temp = {};

        for (var i = 0; i < bodyJSON.status.conditions.length; i++) {
            if(bodyJSON.status.conditions[i].status == "True"){
                result.push(bodyJSON.status.conditions[i].type);
            }

        }

        console.log(result);

    });

};

3 个答案:

答案 0 :(得分:1)

{
  "presets": [
    "es2015",
    "react"
  ]
}

关于Node的最好的事情之一就是异步。一开始可能很难理解,但一旦你知道,这是最好的事情。这也是Node如此之快的原因。

因此,当您必须运行异步函数时,您还会向称为回调函数的异步函数发送一个额外函数,该函数将在异步操作完成后执行。上面的代码说明了这一点。

然后你可以使用这样的功能:

 function daemonGetNodeStatus(kubeURL, nodeName, callback) {
    console.log(nodeName);
    var request = require("request");
    var options = {
        method: 'GET',
        url: kubeURL+'/api/v1/nodes/'+nodeName+'/status',
        headers: {
            'Cache-Control': 'no-cache',
            'Authorization': 'Bearer '+constants.accessToken
        }
    };

    request(options, function(error, response, body) {
        if (error)
        {
            callback(error);
        } else {

            var bodyJSON = JSON.parse(body);

            var result = [];

            var temp = {};

            for (var i = 0; i < bodyJSON.status.conditions.length; i++) {
                if(bodyJSON.status.conditions[i].status == "True"){
                    result.push(bodyJSON.status.conditions[i].type);
                }

            }
            callback(null, result);
        }
    });
 }

答案 1 :(得分:1)

我想再回答一下 - async\await。如果您安装了NodeJS v8,最好坚持使用async\await

另外,我做了一些改进,如果你不喜欢,可以随意忽略它们。

1)async/await为您提供了编写和处理异步代码的更方便的方法。您只需编写await

,而不是回调或承诺链

2)您可以使用for-loopfilter来查找状态为True的所有k8条件,而不是通过map遍历数组。

3} json选项中的request字段将解析响应为JSON,并返回已解析的JSON值。

const request = require("request-promise");

async function daemonGetNodeStatus(kubeURL, nodeName) {
    const options = {
        json: true,
        method: 'GET',
        url: kubeURL + '/api/v1/nodes/' + nodeName + '/status',
        headers: {
            'Cache-Control': 'no-cache',
            'Authorization': 'Bearer '+constants.accessToken
        }
    };

    const response = await request(options);

    return response.status.conditions.filter(cond => cond.status === 'True').map(cond => cond.type);
});

<强> UPD 任何async函数都会返回Promise,因此您需要等待它或使用then\catch调用它:

async function someAnotherAsyncFunction() {
    const types = await daemonGetNodeStatus('KUBE_URL', 'NODE_NAME');
    // do something with types
}

daemonGetNodeStatus.then(types => doSomethingWithTypes(types)).catch(error => doSomethingWithError(error));

答案 2 :(得分:0)

您可以使用this Q&A for more info

v1list[i-1].set(UserName)
v2list[i-1].set(UserAge)