微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

我试图从这个函数获取“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])     

解决方法

代码有两个问题。

  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...

,

您正在尝试在 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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。