Thật khó chịu khi không có một giải pháp đơn giản nào và việc bọc lại return new Promise(...)
khá khó chịu, nhưng tôi đã tìm thấy một cách sử dụng khá ổn util.promisify
(thực ra nó cũng thực hiện cách gói tương tự, chỉ trông đẹp hơn).
function voidFunction(someArgs, callback) {
api.onActionwhichTakesTime(someMoreArgs, (response_we_need) => {
callback(null, response_we_need);
});
}
Hàm trên không trả về bất cứ thứ gì. Chúng ta có thể làm cho nó trả về một Promise
trong những giá trị response
đã chuyển callback
bằng cách:
const util = require('util');
const asyncFunction = util.promisify(voidFunction);
Bây giờ chúng ta có thể thực sự await
là callback
.
async function test() {
return await asyncFunction(args);
}
Một số quy tắc khi sử dụng util.promisify
- Đối số
callback
phải là đối số cuối cùng của hàm sẽ làpromisify
- Cuộc gọi lại được cho là phải ở dạng
(err, res) => {...}
Điều buồn cười là chúng ta không cần phải viết cụ thể callback
thực tế là gì.