如何解决为什么我的数组在函数之外返回未定义?
我试图从这个函数中获取“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])
解决方法
代码有两个问题。
-
在收到请求的响应之前,尝试访问处理
https
请求的结果,即msg
中保存的getArr
条目:-
data.map(( msg ) => {...
在回调函数中收到响应后执行。 -
console.log(getArr.slice(-1)[0])
在向浏览器(浏览器可能已经或可能尚未发起网络请求)发出请求之后并且肯定在调用回调之前同步执行。
规范答案:How do I return the response from an asynchronous call?
-
-
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 举报,一经查实,本站将立刻删除。