thắc mắc hỏi về hàm async trong javascript

Ví dụ đây là hàm con người cho động vật trong một cái hộp ăn. Giả sử trong hộp không có con vật nào thì con người đi săn động vật và bỏ vào hộp đó. Mình code như này làm ngắt giữa chừng hàm async thì có được không mọi người, tại bọn nó khuyên là hàm async thì không nên return??

ví dụ
JavaScript:
async function feedAnimal() {
    animals = []
    animals = await db.find(box)
    if (animals.length === 0) {
        return animals
    } else {
        for (animal of animals) {
            await human.feed(animal)
        }
    }
}
if (feedAnimal() === []) {
    human.hunt()
}
 
Ví dụ đây là hàm con người cho động vật trong một cái hộp ăn. Giả sử trong hộp không có con vật nào thì con người đi săn động vật và bỏ vào hộp đó. Mình code như này làm ngắt giữa chừng hàm async thì có được không mọi người, tại bọn nó khuyên là hàm async thì không nên return??

ví dụ
JavaScript:
async function feedAnimal() {
    animals = []
    animals = await db.find(box)
    if (animals.length === 0) {
        return animals
    } else {
        for (animal of animals) {
            await human.feed(animal)
        }
    }
}
if (feedAnimal() === []) {
    human.hunt()
}
Ý fence ngắt giữa chừng là thế nào nhỉ
xjIzSG9.png
 
View attachment 803427View attachment 803423
https://developer.mozilla.org/en-US...avaScript/Reference/Statements/async_function

fen cho hỏi chỗ này bọn nó viết là sao nhỉ, mấy cái về nodejs khó hiểu vãi, mình học như học vẹt, chả hiểu rõ bản chất lắm
Chỗ này không phải là hàm aysnc thì nó không nên return value.
Chỗ này có nghĩa là nếu mà fence đã tạo ra một hàm async thì value của nó lúc nào cũng được bọc trong một Promise.
ví dụ:

Code:
async funtion foo() : Promise<number> {
    return 1;
}

console.log(foo())

Như hàm foo ở trên thì dù nó có giá trị trả về là number nhưng mà js sẽ tự động bọc nó lại trong một Promise và kết quả trả về của nó là Promise<number>
 
nếu muốn sử dụng giá trị trả về trong một hàm Promise thì sử dụng callback, đối với một chuỗi các Promise thì nên xài Promise.all
 
Ví dụ đây là hàm con người cho động vật trong một cái hộp ăn. Giả sử trong hộp không có con vật nào thì con người đi săn động vật và bỏ vào hộp đó. Mình code như này làm ngắt giữa chừng hàm async thì có được không mọi người, tại bọn nó khuyên là hàm async thì không nên return??

ví dụ
JavaScript:
async function feedAnimal() {
    animals = []
    animals = await db.find(box)
    if (animals.length === 0) {
        return animals
    } else {
        for (animal of animals) {
            await human.feed(animal)
        }
    }
}
if (feedAnimal() === []) {
    human.hunt()
}
if (feedAnimal() === []) chuyển thành if (await feedAnimal() === [])
Vì hàm async function feedAnimal return về 1 promise,
Note: lun nhớ là 1 promise thì phải có await hoặc .then()
mà so sánh if === [] thì ko ổn. như các bác trên kia thì nên so sánh length của feedAnimal() thì mới đúng
 
t nhìn thấy trong code của ông có mấy lỗi như sau
1. dòng 5 đã return rồi thì dòng 6 else làm gì nữa?
2. nên cẩn thận khi dùng await in loop
3. mảng là khi JS khởi tạo sẽ có reference khác nhau, nên khi kể cả ông so sánh [] === [] nó vẫn ra false nhé.
code t sửa cho ông này :v

JavaScript:
async function feedAnimal() {
    let animals = []
    animals = await db.find(box)
    if (animals.length === 0) {
        return null;
    }
    for (const animal of animals) {
        await human.feed(animal)
    }
    return animals;
}
// async function return a promise
feedAnimal()
.then(animals => {
    if (!animal?.length) human.hunt();
})
.catch(e => console.log(e))
 
t nhìn thấy trong code của ông có mấy lỗi như sau
1. dòng 5 đã return rồi thì dòng 6 else làm gì nữa?
2. nên cẩn thận khi dùng await in loop
3. mảng là khi JS khởi tạo sẽ có reference khác nhau, nên khi kể cả ông so sánh [] === [] nó vẫn ra false nhé.
code t sửa cho ông này :v

JavaScript:
async function feedAnimal() {
    let animals = []
    animals = await db.find(box)
    if (animals.length === 0) {
        return null;
    }
    for (const animal of animals) {
        await human.feed(animal)
    }
    return animals;
}
// async function return a promise
feedAnimal()
.then(animals => {
    if (!animal?.length) human.hunt();
})
.catch(e => console.log(e))
Thật ra cũng không cần phải check if chỗ đó, nếu array rỗng thì vòng for sẽ không được chạy th.
Với lại nên đồng nhất trả về một kiểu chứ không nên ở trong if trả null còn ở dưới trả ra array => xuống dưới cùng lại dùng ? operator check null là không cần thiết.
Q8sGcLO.png


Code thì nó sẽ như thế này:


JavaScript:
async function feedAnimal() {
    let animals = []
    animals = await db.find(box)
    for (const animal of animals) {
        await human.feed(animal)
    }
    return animals;
}
// async function return a promise
feedAnimal()
.then(animals => {
    if (!animal.length) human.hunt();
})
.catch(e => console.log(e))
 
Thật ra cũng không cần phải check if chỗ đó, nếu array rỗng thì vòng for sẽ không được chạy th.
Với lại nên đồng nhất trả về một kiểu chứ không nên ở trong if trả null còn ở dưới trả ra array => xuống dưới cùng lại dùng ? operator check null là không cần thiết.
Q8sGcLO.png


Code thì nó sẽ như thế này:


JavaScript:
async function feedAnimal() {
    let animals = []
    animals = await db.find(box)
    for (const animal of animals) {
        await human.feed(animal)
    }
    return animals;
}
// async function return a promise
feedAnimal()
.then(animals => {
    if (!animal.length) human.hunt();
})
.catch(e => console.log(e))
ye gọn gàng hơn r này.
nma không ngoại trừ trường hợp db.find trả ra null nên vẫn cần check null tại dòng animal?.length
 
ye gọn gàng hơn r này.
nma không ngoại trừ trường hợp db.find trả ra null nên vẫn cần check null tại dòng animal?.length
Mình đã xài qua Typeorm, Sequelize với lại knex thì thấy tụi nó luôn luôn trả về array đó fence và mình tin là ORM library nào cũng có convention như vậy. Trong docs nó cũng có ghi mừ
meoqQpA.png
 
Mình đã xài qua Typeorm, Sequelize với lại knex thì thấy tụi nó luôn luôn trả về array đó fence và mình tin là ORM library nào cũng có convention như vậy. Trong docs nó cũng có ghi mừ
meoqQpA.png
oke fence mình k code BE nên cũng k biết :D
 
Last edited:
@hung291bg @teeeeeeeee tui hỏi chỗ này, vì return của async ra một promise.

Khi một hàm khác sử dụng giá trị promise này ở bên trong thì làm sao để return khỏi hàm khi giá trị bên trong cái promise đó không phù hợp nhỉ?

ví dụ ở trong func2 muốn return ra ngoài nếu giá trị bên trong promise của func1 là 1. Dưới đây là code sai, làm sao để sửa cho đúng với ý tưởng đó vậy?

JavaScript:
async func1() {
    return 1
}
async func2() {
    const x = func1();
    if (x===1) {
        return
   }
}
 
@hung291bg @teeeeeeeee tui hỏi chỗ này, vì return của async ra một promise.

Khi một hàm khác sử dụng giá trị promise này ở bên trong thì làm sao để return khỏi hàm khi giá trị bên trong cái promise đó không phù hợp nhỉ?

ví dụ:

JavaScript:
async func1() {

    return 1

}





async func2() {

const x = func1();

if (x===1) {

return

}

}
Q8sGcLO.png
Q8sGcLO.png


Tự tìm hiểu đi cho mau giỏi fence, chứ hỏi xong mà một lời cảm ơn cũng không biết nói thì còn phải học thêm nhiều thứ ngoài code nữa
4gmOAMB.png
 
Back
Top