มันน่ารำคาญที่ไม่มีวิธีแก้ปัญหาที่ตรงไปตรงมาและการห่อreturn new Promise(...)
ก็น่ากลัว แต่ฉันพบวิธีแก้ปัญหาที่ใช้ได้util.promisify
(จริงๆแล้วมันก็ห่อแบบเดียวกันด้วยนะดูดีกว่า)
function voidFunction(someArgs, callback) {
api.onActionwhichTakesTime(someMoreArgs, (response_we_need) => {
callback(null, response_we_need);
});
}
ฟังก์ชันข้างต้นยังไม่ส่งคืนอะไรเลย เราสามารถทำให้มันคืนค่าPromise
ของการresponse
ส่งผ่านcallback
โดยทำ:
const util = require('util');
const asyncFunction = util.promisify(voidFunction);
ตอนนี้เราสามารถจริงawait
callback
async function test() {
return await asyncFunction(args);
}
กฎบางอย่างเมื่อใช้ util.promisify
callback
ต้องเป็นอาร์กิวเมนต์สุดท้ายของฟังก์ชั่นที่จะเป็นpromisify
- การโทรกลับที่คาดว่าจะต้องอยู่ในรูปแบบ
(err, res) => {...}
สิ่งที่น่าตลกคือเราไม่จำเป็นต้องเขียนเจาะจงว่าอะไรคือความcallback
จริง