Array bị undefined trong JS

Cho em hỏi một chút ạ, đầu tiên em fetch từ trang web có sẵn để lấy dữ liệu có dạng là một object, sau đó em truyền dữ liệu vào mảng đã tạo sẵn để lưu trữ dữ liệu đã lấy ra.nhưng khi em console.log ra một phần tử bất kì trong mảng thì nó lại hiện ra undefined.

const question = [];
async function postData(url = "") {
     const response = await fetch(url, {
     method: 'POST', // *GET, POST, PUT, DELETE, etc.
        headers: {
            'Content-Type': 'application/json'
                // 'Content-Type': 'application/x-www-form-urlencoded',
        },
    });
    return response.json(); // parses JSON response into native JavaScript objects
}

function new_object(data) {
    for (let i = 0; i < Object.keys(data).length; i++) {
        //truyen du lieu vao array da tao
        question.push(data.questions[i].text);
    }
}
postData("https://wpr-quiz-api.herokuapp.com/attempts").then(new_object);
console.log(question[1]);

Nếu nhập console.log(question) thì nó hiện ra như sau nhưng nếu mà nhập như trên thì nó lại ra undefined ạ. Vậy cho em hỏi là nó bị vấn đề gì ạ và làm thế nào để giải quyết ạ, em xin cảm ơn.
image

Bạn có biết mình đang viết cái gì không

5 Likes

Khai báo này rồi làm sao thay đổi giá trị của nó được nhỉ?

1 Like

JS mảng động mà bác, ban đầu khai báo mảng rỗng sau đó push vào sau. Em cũng mới hỏi vấn đề này luôn:

Như này mới không được vì a là constant

const a = [];
a = [];

còn như này vẫn đảm bảo giá trị a không thay đổi:

    const a = [];
    a.push(99);
    a.push(88);
    console.log(a);  // [99,88]
1 Like

Em thử đổi từ const sang let rồi nhưng mà kết quả nó vẫn thế ạ, với lại nếu em console.log ở trong function new_object thì kết quả vẫn hiện ra nhưng khi em console.log ở ngoài function ấy thì kết quả nó mới ra undefined ạ

Bạn xem lại về bất đồng bộ trong javascript.

console.log(question[1]) là đồng bộ nên chạy trước (lúc này mảng question chưa có dữ liệu nên gọi question[1] ra undefined là đúng rồi. postData là hàm bất đồng bộ nên trả kết quả sau.

3 Likes

Khai báo const thì không thể thay đổi giá trị, nói câu này nó không được chính xác lắm
Khai báo const thì không thể re-assign (gán lại giá trị) cho biến
Gọi method push không thành vấn đề

5 Likes

Cám ơn bạn đã khai thông. JavaScript thì rách việc thật chứ. Có lẽ mình sẽ phải đọc thêm về JavaScript mới được vì mình hiểu const mang = []; nghĩa là mảng này đã có giá trị “empty” = không thể re-assign cho nó :smiley:

Còn trở lại bài kia, thử:

(new_object).then(question => {
    console.log(question[1]);
})
2 Likes

response.json() là promise nên chổ return trong cái hàm đầu tiên sửa lại thành:

return await response.json()

Call hàm sửa lại thành:

new_object(postData("https://wpr-quiz-api.herokuapp.com/attempts"))

Mình cung cấp solution mì ăn liền cho bạn, hi vọng bạn tìm hiểu thêm để rõ cơ chế của asynchronous, promise

1 Like
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?