使用函数与NodeJS发出http请求。在运行函数时将先前定义的数组作为参数传递,但在控制台记录时数组为空。
var testList = []:
var httpQuery = function(ep, q, lst) {
ep.selectQuery(q).then(function (res) {
return res.json()
}).then(function (result) {
lst = result.results.bindings;
}).catch(function (err) {
console.error(err)
})
};
httpQuery(endpoint, testq, testList);
如何从函数回调中获取数据到我之前定义的数组中,并在函数外部使用它?
答案 0 :(得分:2)
如果你是console.logging' testList'在调用httpQuery之后,当然它将是空的。 httpQuery是异步的(并且在函数内重新分配lst
无论如何都不会有效。)
要处理异步的基于承诺的函数,您必须返回承诺并使用.then()
var httpQuery = function(ep, q) {
return ep.selectQuery(q).then(function (res) {
return res.json()
}).then(function (result) {
return result.results.bindings;
}).catch(function (err) {
console.error(err)
})
};
httpQuery(endpoint, testq)
.then(list => {
console.log(list)
});
[edit]根据您使用的节点版本,您可以使用async / await。上面的代码基本上等同于
async function httpQuery(ep, q) {
try {
let res = await ep.selectQuery(q);
let result = await res.json();
return result.results.bindings;
} catch(e) {
console.error(e);
}
}
(async () => {
let testList = await httpQuery(endpoint, testq);
console.log(testList);
})();