function promisify (api) {
if (!api) return null // на случай если нам ничего не пришло
const promisedApi = {}
for (const prop in api) {
if (typeof (api[prop]) === 'function') {
promisedApi[prop] = (...args) => {
return new Promise((resolve, reject) => {
api[prop]((err, result) => {
if (err) reject(err)
else resolve(result)
}, ...args)
})
}
} else if (Object.keys(api[prop]).length > 0) {
promisedApi[prop] = promisify(api[prop]) // рекурсивно обходим все вложенные свойства
} else {
promisedApi[prop] = api[prop] // статические свойства возвращаем как есть
}
}
return promisedApi
}
const api = {
foo: {
myConst: 12
},
a: {
b: {
c: callback => setTimeout(() => callback(null, 'hello'), 100)
}
},
aa: {
bb: (callback, x, y) => setTimeout(() => callback(null, x + y), 200)
}
}
const promisedApi = promisify(api)
console.log(promisedApi.foo.myConst) // => 12
promisedApi.a.b.c().then(res => console.log(res)) // => hello
promisedApi.aa.bb(1, 2).then(res => console.log(res)) // => 3