LEATH
2022-10-21 10:37:56
好的,伙計們,我在我一直在處理的一些代碼上遇到了問題。在下面的代碼中,我試圖通過控制臺記錄數組的長度,但是在打印到控制臺后,我得到數組長度的輸出 0,當我打印數組本身時,它顯示它是空的,但我可以單擊下拉箭頭并查看其中的元素。// randomly selects card from arrayexport const selectCard = arr => { const randomArr = Math.floor(Math.random() * arr.length); console.log(arr.length); console.log(arr);}記錄數組長度和內部包含元素的空數組的圖像。為了測試發生了什么,我決定將數組記錄在一個不同的函數中,該函數位于創建數組的同一文件中。數組 ( blackCards) 存儲在一個對象中。let packArr = { data: {}, packToUse: [], whiteCards: [], blackCards: [],};blackCards控制臺在另一個函數中記錄數組 ( ) 會記錄以下內容:const seperatePacks = (data) => { // add white cards to array packArr.whiteCards.push(data.whiteCards); // add black cards to array packArr.blackCards.push(data.blackCards); // console log blackCards array console.log(packArr.blackCards);};來自不同函數的記錄數組的圖像,該函數位于創建和存儲數組的同一文件中。這里有更多關于我的代碼如何工作的信息。當用戶單擊按鈕時,將激活一個事件偵聽器,該偵聽器調用最終從服務器獲取 json 的其他函數,然后我將該數據添加到數組中,您可以在上面的代碼中看到。因此,既然您知道代碼是如何工作的,那么我就可以了解導致我更加困惑的原因。所以,在第一次點擊時,我得到了所有先前代碼和圖像組合的結果,但是如果我再次點擊同一個按鈕,或者點擊不同的按鈕,我會得到想要的結果(如果我點擊兩個按鈕我得到數組中的兩個元素,所以它工作正常)。因此,單擊兩次或多次,程序就會按應有的方式運行。這里的任何幫助都會很棒。如果這篇文章有點磨損也很抱歉,這是我的第一篇。以下是最終調用的函數selectCardelements.packs.addEventListener("click", (e) => { const packID = e.target.closest(".pack").id; if (packID) { packsToUse(packID); // create black cards blackCardDisplay(packArr.blackCards); }});上面是前面提到的監聽器,它調用下面的函數,它會調用selectCard.export const blackCardDisplay = data => { const card = ` <div class="cards card--black"> <h1 class="card--black-text card--text">${selectCard(data)}</h1> </div> `;}這是按下兩個按鈕后的輸出。該數組應該包含兩個元素,但在這種情況下它只顯示一個。但是,當我展開數組時,它顯示的長度為 2 而不僅僅是 1。單擊兩次按鈕的控制臺圖像編輯:在閱讀了一些評論后,我意識到我忘了提到的內容blackCards是一個數組。所以我在一個數組中有一個數組。
1 回答

暮色呼如
TA貢獻1853條經驗 獲得超9個贊
因此,在閱讀了一些評論后,我決定實施@charlietfl 的評論,即數組可能在 ajax 調用完成之前被控制臺記錄。雖然這并沒有明確解決問題,但它讓我走上了解決方案的正確軌道。
這是我解決這個問題的方法:
我接受了關于在 ajax 調用完成之前完成控制臺日志的評論,并從那里進行了一些研究,發現了這篇非常簡單的文章:
https://www.programmersought.com/article/26802083505/
在這篇文章中是一個使用該setTimeout()方法的例子。
這是我的問題的最終解決方案。
export const selectCard = arr => {
const randomArr = Math.floor(Math.random() * arr.length);
setTimeout(() => {
console.log(arr.length);
console.log(arr)
}, 1000);
}
這是在setTimeout()第一次按下按鈕時添加方法后的輸出。
我不知道這是否是該問題的最佳解決方案,因為過去我看到有些人不贊成使用這種方法,但它對于我目前正在做的事情來說效果很好。如果有人有更好的方法來解決這個問題,我很想聽聽!
添加回答
舉報
0/150
提交
取消