Kết quả của promise chỉ có thể được lấy ở trong then, và phải ở dạng hàm

Thứ được return trong hàm làm đối số của then() sẽ được truyền tiếp vào then() tiếp theo:

const promise = new Promise((hàmGiảiQuyết) => {
  hàmGiảiQuyết('Success!');
});
promise.then(() => "Chuỗi này được trả về trong console").then(console.log) // "Chuỗi này được trả về trong console"
promise.then("Chuỗi này bị bỏ qua").then(console.log) // "Success!"

Nếu nó không phải là hàm, thì nó sẽ được thay thế bằng hàm đồng nhất (x) => x, which simply passes the fulfillment value forward.

Hàm được dùng làm đối số đầu tiên của then sẽ chạy khi hàm resolve được gọi. Hàm được dùng làm đối số thứ hai của then sẽ chạy khi hàm reject được gọi

Tại sao khi gọi async function thì lại để console.log() trong then chứ không để ở ngoài được nhỉ? Phải là:

asyncFunction(arg).then((result) => { console.log(result) })

Chứ không thể là:

const a = asyncFunction(arg).then((result) => { result }) console.log(a)

ở ngoài thì log ra Promise, ở trong then thì log ra kết quả của Promise

tại async function lúc tạo ra nó là nó đẩy vào 1 cái asyncqueue thôi
asyncFunction(arg) là đẩy asyncFunction(arg) vào cái asyncQ, xong chạy tiếp các code bên dưới, vd ở đây là console.log(a)
a lúc này là null vì asyncFunction(arg) chưa chạy xong
sau khi asyncFunction(arg) thì a mới được gán = result, lúc này console.log(a) đã chạy rồi

  • asyncFunction(arg) -> đẩy vào asyncQ
  • chạy tiếp console.log(a) // in ra object rỗng hay null gì đấy
  • asyncFunction(arg) chạy xong, gán a = 1 object mới là result, object a cũ được log trong console vẫn là null

Nếu để console.log() ở trong then thì

  • asyncFunction(arg) đẩy vào asyncQ
  • chờ asyncFunction(arg) chạy xong, chạy .then: gọi console.log(result)

code của main loop js thì có thể là như thế này:

while (1) {
    chạy 1 vài lệnh trong main loop
    nếu asyncQ  việc, pop 1 việc ra chạy việc đó 
}

thì cái code kia nó chạy là

while (1) {
    const a = asyncFunction(arg).then((result) => { result });
    console.log(a); 
}

thì nó chạy theo kiểu

- vòng lặp thứ 1:
  - đẩy asyncFunction(arg) vào asyncQ
  - console.log(a)
- vòng lặp thứ 2:
  - asyncQ có việc, pop ra là asyncFunction(arg)
  - chạy asyncFunction(arg)
  - chạy xong gọi tiếp .then:
    - gán a = result

nếu 1 hàm có liên quan tới internet download gì đó thì nó sẽ đẩy lệnh download/upload đó vào 1 cái queue khác là networkQ gì đấy, cái networkQ này là 1 threadpool thật. Còn asyncQ chỉ là 1 cái queue thuần túy thôi thì phải

JS có đa luồng ở networkQ, nhưng ko có đa luồng ở asyncQ

JS khác với các ngôn ngữ khác chỉ chạy 1 lần rồi tắt thì JS nó chạy suốt thời gian tồn tại của 1 tab trong browser nên nó xài 1 cái loop vô tận (tới khi tắt tab) gọi là event loop :V

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Event_loop

a lúc này là null vì asyncFunction(arg) chưa chạy xong
nếu code vậy thì giá trị của aPromise mà chứ đâu null nhỉ anh
toy cũng ko chắc :V biết sơ sơ à :V console log nó in ra gì
in ra promise thì a là promise thôi
chắc là null chớ

Nguồn:: Discord