【问题标题】:JSON variable returns UndefinedJSON 变量返回未定义
【发布时间】:2020-11-29 00:08:56
【问题描述】:

很抱歉给您带来不便,我是 Node.js 的新手。我正在尝试将 json 存储在“usersData”变量中,以便稍后在其他函数中使用它。问题是,如果我在“if”中使用console.log 测试变量,它会返回给我结果,但是当尝试在请求子函数之外显示变量时,它会出现“未定义”。我已经声明了全局 usersData 变量,如下所示。谢谢。

var usersData;

function getAllUsers(){
  request({url, json: true}, function (error, response, body) {
    if (!error && response.statusCode == 200) {
      usersData = body
      //console.log(usersData)  //Here returns a value
    }
  });
  console.log(usersData)  //here returns undefined
}

【问题讨论】:

    标签: node.js json variables return undefined


    【解决方案1】:

    request 是异步方法,所以如果你想稍后在另一个函数中使用它的结果,应该在第二个参数回调中处理。即

    var usersData;
    
    var handleUserData = function() {};
    
    function getAllUsers(){
      request({url, json: true}, function (error, response, body) {
        if (!error && response.statusCode == 200) {
          usersData = body
          //console.log(usersData)  //Here returns a value
    
          // use results in another function
          handleUserData(body);
        }
      });
    }
    

    或使用Promise

    function getAllUsers() {
      return new Promise(function(resolve, reject) {
    
        request({url, json: true}, function (error, response, body) {
          if (!error && response.statusCode == 200) {
            usersData = body
            //console.log(usersData)  //Here returns a value
            resolve(body);
          } else {
            reject(error);
          }
        });
    
      });
    }
    
    // handle `usersData`
    getAllUsers().then(body => {
      handleUserData(body);
    });
    

    【讨论】:

    • 非常感谢 Winky,正如你所说 除了下一个回复的理论之外,我真的没有计算请求的异步性,也不知道如何处理承诺中的响应。它为我服务了 100%。谢谢。
    【解决方案2】:

    这里有一些你需要知道的东西, request 是一个异步函数,这意味着它在后台运行而不会阻塞主线程,因此回调函数在请求完成后执行,这就是为什么将 body 的值分配给 userData 并在打印时给出一些值。

    但是当在回调函数之外打印时,它给出了 undefined 因为request 是异步的需要时间来完成在后台运行的。因此,consoling 语句在正文分配给 userData 之前运行,因此在打印时给出未定义。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-11-24
      • 2012-01-16
      • 1970-01-01
      • 1970-01-01
      • 2019-05-03
      • 2020-08-21
      • 2016-05-03
      • 2016-05-13
      相关资源
      最近更新 更多