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.
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à:
Chứ không thể là:
ở 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:
thì cái code kia nó chạy là
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 a
là Promise
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