簡體   English   中英

從函數范圍內獲取數組數據

[英]Fetch array data from inside function scope

我目前正在嘗試使用已在函數作用域內填充的數組。 我的主要問題是,每當我嘗試將數組作為信息發送時,系統就會告訴我它為空。

野兔是我的嵌套函數:

exports.getUserDetails = async function(req ,res ,next){
  try{
      Stats.find({map:"France"}).sort({lapTime:1}).limit(3).then(response =>{
          var resultArray=[]; // <----Here is where I've innitialised my array
          for(var item = 0; item < response.length; item++){
                const singleDriverId = response[item].driver;
                const playedMap = response[item].map; // single Map etry from the stats Object
                const timedLap = response[item].lapTime; //single lapTime entry from the stats Object

                User.find({"_id" : singleDriverId}, function(err, result){
                  if (err) throw err;
                  for (var i = 0; i< result.length; i++){

                   //setting up the Object to populate the Array.
                    var finalResult = {
                        "driver": result[i].firstName + " " + result[i].lastName,
                        "map": playedMap,
                        "laptime": timedLap
                      }
                      //<------populating the Array
                      resultArray.push(finalResult);
                    }
                  });
            }
            console.log(resultArray) // prints an empty Array []
            res.status(200).json({status: 200, data: resultArray, message: "Successfully got the user details."});
        })   
    }catch(error){
        console.log(error);
        res.status(400);
    }
}

我認為以某種方式resultArray.push(finalResult); 我有機會打印之前的“空”字嗎?

有人對為什么會發生這種情況有什么建議,我該如何解決?

我正在嘗試從resultArray.push(finalResult)接收單個數組

您問題的通用示例(javascript的異步特性)

 function getData(cb) { setTimeout(() => cb(Date.now()), Math.random() * 1000); } const result = []; for (var i = 0; i < 10; i++) { getData((data) => { result.push(data); }); } console.log(result); // empty :O 

通用的解決方案(運行done ,當一切都完成):

 function getData(cb) { setTimeout(() => cb(Date.now()), Math.random() * 1000); } const result = []; const count = 10; for (var i = 0; i < count; i++) { getData((data) => { result.push(data); done(); }); } var called = 0; function done() { called++; if (called === count) { console.log(result); // desired result \\O/ } } 

當然,現在有了promise和async / await,一切都變得更加簡單(使用async / await,它看起來幾乎就像是一個同步代碼)。 有多篇文章以及如何使用它們的教程。

對於您的代碼,它應該是這樣的(請注意,當您執行網絡請求時,響應的順序可能與發送請求的順序不同,因此resultArray的項可能與響應中的項不完全對應):

exports.getUserDetails = async function(req ,res ,next){
  try{
      Stats.find({map:"France"}).sort({lapTime:1}).limit(3).then(response =>{
          var resultArray=[]; // <----Here is where I've innitialised my array
          for(var item = 0; item < response.length; item++){
                const singleDriverId = response[item].driver;
                const playedMap = response[item].map; // single Map etry from the stats Object
                const timedLap = response[item].lapTime; //single lapTime entry from the stats Object

                User.find({"_id" : singleDriverId}, function(err, result){
                  if (err) throw err;
                  for (var i = 0; i< result.length; i++){

                   //setting up the Object to populate the Array.
                    var finalResult = {
                        "driver": result[i].firstName + " " + result[i].lastName,
                        "map": playedMap,
                        "laptime": timedLap
                      }
                      //<------populating the Array
                      resultArray.push(finalResult);
                      done(); // function is run whenever data is pushed
                    }
                  });
            }
            var count = 0;
            function done() {
              count++;
              if (count === response.length) { // this code block is run only when all items are pushed into the resultArray
                console.log(resultArray) 
              }
            }
            res.status(200).json({status: 200, data: resultArray, message: "Successfully got the user details."});
        })   
    }catch(error){
        console.log(error);
        res.status(400);
    }
}

可能User.find也支持promise,因此使用Promise.all方式更簡單,可讀性更好。

只需使用if語句,它將起作用

if(resultArray){console.log(resultArray)//打印一個空Array [] res.status(200).json({status:200,data:resultArray,消息:“已成功獲取用戶詳細信息。”}); }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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