Tôi đọc rằng các hàm không đồng bộ được đánh dấu bằng async
từ khóa ngầm trả về một lời hứa:
async function getVal(){
return await doSomethingAync();
}
var ret = getVal();
console.log(ret);
nhưng điều đó không nhất quán ... giả sử doSomethingAsync()
trả về một lời hứa và từ khóa await sẽ trả về giá trị từ lời hứa, không phải itsef lời hứa, thì hàm getVal của tôi sẽ trả về giá trị đó, không phải là lời hứa ngầm.
Vậy trường hợp chính xác là gì? Các hàm được đánh dấu bởi từ khóa async có ngầm trả về các lời hứa hay chúng ta kiểm soát những gì chúng trả về?
Có lẽ nếu chúng ta không trả lại một cách rõ ràng một điều gì đó, thì họ đã ngầm trả lại một lời hứa…?
Nói rõ hơn, có sự khác biệt giữa phần trên và
function doSomethingAync(charlie) {
return new Promise(function (resolve) {
setTimeout(function () {
resolve(charlie || 'yikes');
}, 100);
})
}
async function getVal(){
var val = await doSomethingAync(); // val is not a promise
console.log(val); // logs 'yikes' or whatever
return val; // but this returns a promise
}
var ret = getVal();
console.log(ret); //logs a promise
Trong phần tóm tắt của tôi, hành vi thực sự không phù hợp với các câu lệnh trả về truyền thống. Có vẻ như khi bạn trả về một giá trị không phải là lời hứa một cách rõ ràng từ một async
hàm, nó sẽ buộc gói nó trong một lời hứa. Tôi không có vấn đề gì lớn với nó, nhưng nó bất chấp JS bình thường.
console.log
cho thấy?