【问题标题】:Passing data from request module out of a function? [duplicate]将请求模块中的数据从函数中传递出去? [复制]
【发布时间】:2017-03-05 16:31:23
【问题描述】:

我正在开发一个模块,该模块使用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;
        }
    });
}

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

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

【问题讨论】:

  • request.post 是异步的,您要么必须将回调函数传递给使用 parsedData 执行的 getData 函数,要么使用 Promise

标签: node.js function asynchronous return


【解决方案1】:

像这样使用 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);
}) 

【讨论】:

    【解决方案2】:

    使用 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)});
    

    【讨论】:

    • 请始终注意通过网络激活的错误。遵循这个模式。
    猜你喜欢
    • 2019-10-19
    • 2018-07-16
    • 2020-04-26
    • 1970-01-01
    • 2020-06-12
    • 1970-01-01
    • 2023-03-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多