yandex_algorithm icon indicating copy to clipboard operation
yandex_algorithm copied to clipboard

Финал, A

Open Destrokhen-main opened this issue 1 year ago • 0 comments

Всем привет. Не знаю, правильно ли понял задачу. Может будут кейсы у вас.

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)

Какая тут логика.

Из объекта я делаю проксю (Это нужно чтобы решить пункт с тем, что апишка должна быть пасивной)

Далее если я получаю из объекта другой объект. Я даю ему хендлеры прокси и возвращаю новую проксю.

Если же я получил, что сейчас у меня функция, я возвращаю функцию с промимом. Жду от неё ответ и отправляю данные. Если это константа, тогда просто возвращаю константу

Destrokhen-main avatar Sep 10 '24 11:09 Destrokhen-main