将请求模块中的数据传递出函数?

时间:2017-03-05 16:31:23

标签: node.js function asynchronous return

我正在处理一个模块,该模块使用request模块返回从http请求中检索到的数据。但是,当我想将数据传递出函数时,我遇到了问题。以此为例。

function getData(term) {
    var parsedData
    request.post(url, term, (err, response, body) => {
        if (!err && response.statusCode == 200) {
              parsedData = doSomethingTo(body);
        }
    });
    return parsedData;
}

此方法不起作用,因为函数getData()异步执行,并且在请求实际返回正确数据之前返回值。

function getData(term) {
    var parsedData
    request.post(url, term, (err, response, body) => {
        if (!err && response.statusCode == 200) {
              parsedData = doSomethingTo(body);
              return parsedData;
        }
    });
}

此方法也不起作用,因为它只会使请求函数返回已解析的数据,而不是getData函数。

如何让父函数返回从请求函数解析的数据?

2 个答案:

答案 0 :(得分:0)

像这样使用Promise:

function getData(term) {
    return new Promise(function(resolve){
      request.post(url, term, (err, response, body) => {
        if (!err && response.statusCode == 200) {
              var parsedData = doSomethingTo(body);
              resolve(parsedData);
        }
      });
   });
}

你可以这样调用你的函数:

getData(term).then(function(data){
   //console.log(data);
}) 

答案 1 :(得分:0)

非常快速地使用bluebird promise模块。

var Promise = require('bluebird');
function getData(term) {
return new Promise(function(resolve,reject){


     if (!err && response.statusCode == 200) {
          var parsedData = doSomethingTo(body);
          resolve(parsedData);
    }else{
    reject(err);
    }
});

}; 

然后你调用该函数的地方就这样做了;

var promise = getData(term);
promise.then(function(data){console.log(data)}).catch(function(err){console.error(err)});