使用函数外部回调的数据

时间:2018-02-28 19:45:55

标签: node.js

使用函数与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);

如何从函数回调中获取数据到我之前定义的数组中,并在函数外部使用它?

1 个答案:

答案 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);
})();