Làm cách nào để function này chạy xong thì mới thực thi function tiếp theo?

Thì có bảo bản lấy data của ajax đâu.
Ajax nó là bất đồng bộ, tức là khi gọi nó xong thì lệnh tiếp tục thực hiện phía dưới ajax mà không chờ ajax nó hoàn thành.
Tức là mong muốn tuần tự của bạn đang đi ngược lại so với chức năng của ajax. Thế thì có nghĩa bạn phải biết được khi nào ajax hoàn thành. Và tiểu xảo đơn giản nhất là lợi dụng khối success hoặc error vì khi hoàn thành thì ajax sẽ thực thi lệnh của 1 trong 2 khối.

Nhắc lại là đây là “tiểu xảo”.

3 Likes

trong function ajax của e nó có vòng lập. nếu bỏ thằng get vào trong là nó bị lập theo, mà ko bỏ vào thì phải chờ thằng ajax chạy xong thì thằng get mới có tác dụng

Cách của anh gợi ý cho em là “đợi” cho đến khi nào ajax chạy xong, tức là đợi cho đến khi có response từ server hoặc có lỗi nào đó xuất hiện rồi sau đó mới chạy hàm get(). Nếu em muốn lưu giá trị trả về thì cứ gán nó vào một biến nào đó. Ví dụ:

(async () => {
    try{
        //Cách 1, dùng async await:
        let res = await $.ajax({
            type: "GET",
            dataType: 'jsonp',
            url: url
        })
        // Không muốn lưu response thi đừng có gán giá trị cho res
       get()
       // Cách 2, dùng Promise:
       $.ajax({
            type: "GET",
            dataType: 'jsonp',
            url: url
        }).done((res) => get())
    }
    catch(err){
        console.log(err)
        // Khi lập trình bất đồng bộ thì nhớ dùng try...catch hoặc dùng method catch()
    }
2 Likes

Mà giờ em muốn chạy hết vòng lặp đó rồi mới dùng hàm get()?

1 Like

đúng rồi a. vì cái get của e là để thêm .html cho thằng div bên trong ajax, nên phải đợi nó load xong mới có div ạ :3

Hmm… Anh không hiểu lắm. Tức là thêm .html, sau đó là thêm code html trả về từ ajax vào .html hay sao?

đúng rồi a.
đây là code html từ thằng ajax content += '<article class="related-item item-'... sau đó thêm .html vào thằng .related-item chẳng hạn

“.html” ở đây là class html hay code html vậy em. Tóm gọn lại là trong hàm ajax() có một vòng lặp chạy $.ajax, em muốn chạy xong hàm ajax, tức là chạy hết vòng lặp đó rồi mới gọi hàm get() đúng không?

2 Likes
Promise
  .all([
    $.ajax(...),
    $.ajax(...),
    ...
  ])
  .then(([obj1, ob2, ...]) => { ... })
3 Likes

đúng rồi a .html() ạ. e muốn gán text() cho class nằm trong ajax

Không biết là nên xài Promise.all hay dùng vòng lặp chạy hàm ajax? Ví dụ như thế này:

for(let i = 0; i < 10; i++){
    (async () => {
        await $.ajax(...)
    })()
}
2 Likes
async function ajax(){
    try{
        for(let i = 0; i < 10; i++){
            //Chém đại cái vòng lặp :))
            await $.post(...) //... Là gì thì tự em thêm vào
        }
    }catch(e){
        console.log(e) 
        /*Trong trường hợp này thì việc dùng try...catch hoặc method catch() khá quan trọng 
        vì lỡ $.ajax quăng lỗi ra hoặc reject vì lí do nào đó thì 
        code bên dưới vẫn có thể chạy được.*/
    }
    return true; //Có return chỗ này là được
}
await ajax()
get()
2 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?