为什么我的数组在函数之外返回未定义?

时间:2021-01-23 23:20:27

标签: javascript arrays api get request

我试图从这个函数中获取“msg”以对其进行数学运算,但它不断返回未定义。但是,当在函数中时,我可以读取数据但不能对其进行数学运算。

let getArr = []
      const https = require('https')
        const options = {
          hostname: 'financialmodelingprep.com',
          port: 443,
          path: '/api/v3/quote/TSLA?apikey=?apikey=demo',
          method: 'GET'
        }
        
        const req = https.request(options, (res) => {
         
             res.on('data', (data) => {
             data = JSON.parse(data)
             data.map(( msg ) => {
                 //console.log(msg)
                 getArr.push(msg)
             })
          })        
        })  
     console.log(getArr.slice(-1)[0])     

2 个答案:

答案 0 :(得分:3)

代码有两个问题。

  1. 在收到请求的响应之前,尝试访问处理 https 请求的结果,即 msg 中保存的 getArr 条目:

    • data.map(( msg ) => {... 在回调函数中收到响应后执行。
    • console.log(getArr.slice(-1)[0]) 在向浏览器(浏览器可能已经或可能尚未发起网络请求)发出请求之后并且肯定在调用回调之前同步执行。

    规范答案:How do I return the response from an asynchronous call?

  2. HTTP(S) 响应以数据包的形式发送,无法保证第一个响应包含要接收的所有 JSON 文本。

    • 代码必须连接传递给 on("data", ) 的数据块,并且只尝试在 on('end', ... ) 回调处理程序中解析完整字符串。

    以前回答:SyntaxError: Unexpected end of JSON input at JSON.parse (... at IncomingMessage...

答案 1 :(得分:2)

您正在尝试在 async req 函数返回之前访问该变量。

试试:

let getArr = []
      const https = require('https')
        const options = {
          hostname: 'financialmodelingprep.com',
          port: 443,
          path: '/api/v3/quote/TSLA?apikey=?apikey=demo',
          method: 'GET'
        }
        
        const req = https.request(options, (res) => {
         
             res.on('data', (data) => {
             data = JSON.parse(data)
             data.map(( msg ) => {
                 //console.log(msg)
                 getArr.push(msg)
             })
             console.log(getArr.slice(-1)[0]);
          }) 
        })  
     //console.log(getArr.slice(-1)[0])     

如何让它“等待”然后更新全局变量:

我明白你在说什么,以及你可能对什么感到困惑。 JS 中的异步编程需要一些范式转换。当您编写异步代码时,您不希望它“等待”然后更新全局变量,您必须在该异步块中编写代码。话虽如此,您可以以更正常的“等待”和“更新”方式编写异步代码,但我建议您从提高对异步的理解开始。这是我觉得很有帮助的一个很好的链接:https://developer.mozilla.org/en-US/docs/Learn/JavaScript/Asynchronous

相关问题