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 Promisetrong những giá trị responseđã chuyển callbackbằng cách:
const util = require('util');
const asyncFunction = util.promisify(voidFunction);
Bây giờ chúng ta có thể thực sự awaitlà callback.
async function test() {
return await asyncFunction(args);
}
Một số quy tắc khi sử dụng util.promisify
- Đối số
callbackphả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ể callbackthực tế là gì.