我有一个函数返回一个从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);
});
};
答案 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-loop
和filter
来查找状态为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)