yandex_algorithm
yandex_algorithm copied to clipboard
Финал, A
Всем привет. Не знаю, правильно ли понял задачу. Может будут кейсы у вас.
const api = {
a: {
b: {
m: 1,
c: callback => setTimeout(() => callback(null, 'hello'), 100)
}
},
aa: {
bb: (callback, x, y) => setTimeout(() => callback(null, x + y), 200)
}
};
const handler = {
get(t, p) {
// Проверяю, есть ли какие-то данные по prop
if (t[p]) {
if (typeof t[p] === "object") {
return new Proxy(t[p], handler) // верну новую проксю, которая будет содержать такие же handler
}
if (typeof t[p] === "function") {
return (...args) => new Promise((r, e) => { // Забираю аргументы, их может быть множество
const callb = (error, data) => {
error ? e(error) : r(data); // тут получаю есть ли ошибка или всё хорошо
}
t[p](callb, ...args) // вызываю функцию с объекта.
} );
}
return t[p];
}
return undefined;
},
};
function promisify(api) {
return new Proxy(api, handler)
}
const promisedApi = promisify(api);
promisedApi.a.b.c()
.then(res => console.log(res)); // => ’hello’
promisedApi.aa.bb(1, 2)
.then(res => console.log(res));
console.log(promisedApi.a.b.m)
Какая тут логика.
Из объекта я делаю проксю (Это нужно чтобы решить пункт с тем, что апишка должна быть пасивной)
Далее если я получаю из объекта другой объект. Я даю ему хендлеры прокси и возвращаю новую проксю.
Если же я получил, что сейчас у меня функция, я возвращаю функцию с промимом. Жду от неё ответ и отправляю данные. Если это константа, тогда просто возвращаю константу