簡體   English   中英

為什么我的數組在 function 之外返回未定義?

[英]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])     

代碼有兩個問題。

  1. 在收到請求的響應之前,嘗試訪問處理https請求的結果, getArr中保存的msg條目:

    • data.map(( msg ) => {...在回調 function 中收到響應后執行。
    • console.log(getArr.slice(-1)[0])在向瀏覽器發出請求(可能已經發起網絡請求,也可能還沒有發起網絡請求)之后,當然在回調被調用之前同步執行。

    規范答案:如何從異步調用返回響應?

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM