มันน่ารำคาญที่ไม่มีวิธีแก้ปัญหาที่ตรงไปตรงมาและการห่อ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);
ตอนนี้เราสามารถจริงawaitcallback
async function test() {
return await asyncFunction(args);
}
กฎบางอย่างเมื่อใช้ util.promisify
callbackต้องเป็นอาร์กิวเมนต์สุดท้ายของฟังก์ชั่นที่จะเป็นpromisify
- การโทรกลับที่คาดว่าจะต้องอยู่ในรูปแบบ
(err, res) => {...}
สิ่งที่น่าตลกคือเราไม่จำเป็นต้องเขียนเจาะจงว่าอะไรคือความcallbackจริง