[英]Why is my array coming back undefined outside of the function?
我正試圖從這個 function 中獲取“味精”來對其進行數學運算,並且它不斷返回未定義。 但是,當在 function 中時,我可以讀取數據但無法對其進行數學運算。
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
請求的結果, getArr
中保存的msg
條目:
data.map(( msg ) => {...
在回調 function 中收到響應后執行。console.log(getArr.slice(-1)[0])
在向瀏覽器發出請求(可能已經發起網絡請求,也可能還沒有發起網絡請求)之后,當然在回調被調用之前同步執行。規范答案:如何從異步調用返回響應?
HTTP(S) 響應以數據包的形式發送,不能保證第一個響應將包含所有要接收的 JSON 文本。
on("data", )
的數據塊,並且只嘗試在on('end', ... )
回調處理程序中解析完整的字符串。以前回答過: SyntaxError: Unexpected end of JSON.parse (... 在 IncomingMessage...
您正在嘗試在異步請求 function 返回之前訪問該變量。
嘗試:
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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.