Lỗi đảo ngược mảng bằng hàm reverse() JS

Xin chào,

let arr = [];
db.collection("NAME").get().then((querySnapshot) => {
    querySnapshot.forEach((doc) => {
        arr.push(doc.id);
    })
})
arr.reverse(); // vẫn theo thứ tự push (không bị đảo ngược)

biến arr đã lấy được dữ liệu từ server rồi nhưng lại không reverse() được ạ, Hàm bên trên là lấy data từ firebase !

Em cảm ơn

sao bạn biết nó không reverse được?
sao bạn không thử console.log arr trước và sau reverse xem?

1 Like

dạ em đã console.log() trước và sau dùng hàm reverse() rồi ạ (em thu gọn lại để up code lên daynhauhoc) em đã đối chiếu với data trên database luôn rồi a, hiện tại em fix bằng cách thay arr.push() bằng arr.unshift()

2 Likes

Vì câu lệnh thứ 3 arr.reverse() chạy trước :smiley: rồi CSDL trả kq về thì lambda trong then nó mới chạy. Gộp reverse vào callback thôi.

5 Likes

và kết quả trước và sau như thế nào?

2 Likes

To @ABCDEFGH1: tớ nghĩ @rogp10 đúng đó. Cậu thử làm theo lời cậu ấy xem?

let arr = [];
db.collection("NAME").get().then((querySnapshot) => {
    querySnapshot.forEach((doc) => {
        arr.push(doc.id);
    })
    arr.reverse();
})
4 Likes

@rogp10 @library tại sao lại như vậy a? cho em hỏi vấn đề thứ tự chạy này liên quan đến kiến thức nào để e học lại a. Cho em xin keyword với

1 Like

Keyword nè: js asynchronous

4 Likes

Do hàm này chờ lâu quá nên nên arr.reverse() chạy trước

1 Like
db.collection("NAME").get().then(doSomethingIfDataExist)

Ở lệnh trên, doSomethingIfDataExist callback sẽ được thực hiện asynchronously với thread mà cậu đã gọi.

Ở code đầu tiên của cậu:

Ở góc nhìn của main process, cậu cơ bản làm điều này:

  1. Cậu khởi tạo mảng arr
  2. Nhờ database object lấy kết quả về từ database, dặn nó nếu lấy về thì đưa dữ liệu vào arr hộ.
  3. Cậu reverse mảng arr mà không quan tâm database object đã làm xong việc chưa.

Kết quả là cậu reverse mảng arr khi nó chẳng có gì (vì DB object chưa xong việc).

Ở code này:

let arr = [];
db.collection("NAME").get().then((querySnapshot) => {
    querySnapshot.forEach((doc) => {
        arr.push(doc.id);
    })
    arr.reverse();
})

Lại từ quan điểm của main process:

  1. Cậu khởi tạo mảng arr
  2. Nhờ database object lấy kết quả về từ database, dặn nó nếu lấy về thì đưa dữ liệu vào arr hộ, xong xuôi rồi reverse array đó hộ dùm.
  3. Cậu ngồi chơi

Kết quả là database object giúp cậu làm hết việc khó, bao gồm cả lấy dữ liệu, để nó vào mảng, rồi lộn mảng đó lại.

Hope it helps!

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