NodeJS请求在接收到json数据时使用json数据

NodeJS请求在接收到json数据时使用json数据,json,node.js,Json,Node.js,我使用NodeJS请求从url获取一些JSON,然后使用JSON对象获取数据。但我不知道如何使用数据,例如,将数据放入变量中而不会出现未定义错误,因为它不会等待json响应通过。我看到了: 但我无法使用ES17功能/我不想这样做 示例1:基本请求 console.logjsonObj//未定义错误 # Example 2: Request promise require("request/package.json"); // request is a peer dependency. var

我使用NodeJS请求从url获取一些JSON,然后使用JSON对象获取数据。但我不知道如何使用数据,例如,将数据放入变量中而不会出现未定义错误,因为它不会等待json响应通过。我看到了:

但我无法使用ES17功能/我不想这样做

示例1:基本请求 console.logjsonObj//未定义错误

# Example 2: Request promise
require("request/package.json"); // request is a peer dependency. 
var rp = require("request-promise")

var options = {
uri: 'http://api.open-notify.org/astros.json',
headers: {
    'User-Agent': 'Request-Promise'
},
json: true 
};

rp(options)
.then(function (jsonTest) {
    var jsonObj = jsonTest.number;
    console.log(jsonObj)
})
.catch(function (err) {
    // API call failed...
    console.log("failure")
});
那么,我如何更改上面的两个示例中的任何一个,以便您可以在请求外部和以后的代码中使用json数据呢

编辑: 我现在看到回调、承诺、异步/等待都是异步的,它们要么依赖于编写嵌套在其中的代码,要么依赖于等待返回然后执行代码的类似于等待的代码


我可以理解为什么承诺和异步/等待会被热切期待,即使回调可以做任何事情,异步代码也会变得非常难看和不可读。这就是为什么我认为嵌套依赖回调的所有内容是错误的,但这很好。

下面是一个简单的示例,说明如何在不使用ES6的情况下使用请求来实现这一点

var request = require('request');
request('http://api.open-notify.org/astros.json', function (error, response, body) {
      var body = JSON.parse(body)
      console.log(body.number);
});

对于回调示例,任何需要请求结果的操作都必须在回调中运行。见下文

request.get({
    url: url,
    json: true,
    headers: {'User-Agent': 'request'}
  }, (err, res, data) => {
    if (err) {
      console.log('Error:', err);
    } else if (res.statusCode !== 200) {
      console.log('Status:', res.statusCode);
    } else {

      var jsonObj = data.html_url
      console.log(jsonObj) // error not defined //You must use the variable here. 
    }
});

原因是回调之外的任何内容都将在回调之前执行。在您的特定情况下,回调实际上只在console.logjsonObj之后执行。您不能在外部执行。在处理请求之后,要执行的任何操作都必须在回调函数或then块中执行。这是异步编程的基本原理。是的,我知道。这是我的问题。因为我知道async可以在响应看到我的编辑之前解决代码执行问题,所以我知道承诺/回调可以做到这一点。如果没有人给我一个实际的答案,我将被迫做出一个非常糟糕的If条件,这个条件取决于一个变量,该变量在回调工作时会发生变化。此外,直到今天我才知道回调是什么,但我开始认为我可以通过添加另一个回调来“解决”这个问题,并进入回调地狱。承诺应该更好,但我不知道如何使用它们…我不确定我是否理解。你为什么需要再次回电话?在当前的一次回调中,你只能做你需要做的所有事情。是的,我不会再做另一次回调。我现在意识到,由于回调/承诺总是在最后执行,因此没有任何东西会在它之后执行。所以回调现在看起来真的很糟糕,如果一旦你使用它,如果你所有的代码都依赖于回调的结果,那么所有的代码都必须在回调中。这在我看来非常奇怪。我可以有1000行代码、函数、orm查询,这些与回调完全无关的东西,但无论如何都会被强制放入其中,因为代码的执行取决于回调返回的内容。看到我的困惑了吗?好吧,我的认识是:1。承诺和回调都适用于异步代码,承诺有时更好。2.我必须等待回调/响应结束,或者将所有嵌套的代码放入回调中
request.get({
    url: url,
    json: true,
    headers: {'User-Agent': 'request'}
  }, (err, res, data) => {
    if (err) {
      console.log('Error:', err);
    } else if (res.statusCode !== 200) {
      console.log('Status:', res.statusCode);
    } else {

      var jsonObj = data.html_url
      console.log(jsonObj) // error not defined //You must use the variable here. 
    }
});