Skip to content

Instantly share code, notes, and snippets.

@vituchon
Last active April 21, 2023 13:21
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save vituchon/a72a9af8aaaadb670d09c70914f1ac34 to your computer and use it in GitHub Desktop.
Save vituchon/a72a9af8aaaadb670d09c70914f1ac34 to your computer and use it in GitHub Desktop.
Construyendo deferreds a manopla
function deferBuilder<T>() {
type resolveType = (value: T) => void;
interface resolveInterface { // no funca con interface :S
(value: T): void;
}
type rejectType = (reason?: any) => void
var resolve: resolveType;
var reject: rejectType
const promise = new Promise(function (_resolve: resolveType, _reject: rejectType) {
console.log("newPromise")
resolve = _resolve
reject = _reject
})
console.log("after newPromise")
return {
promise: promise,
resolve: resolve,
reject: reject
}
}
var a = deferBuilder<number>();
a.promise.then((valor) => {
console.log("valor:", valor)
})
console.log("before resolve")
a.resolve(54)
console.log("after resolve")
@vituchon
Copy link
Author

@fernandezpablo85 me podés validar esto? yo creo que esta bien, no?

@vituchon
Copy link
Author

@abologna you are invited as well 😸

@fernandezpablo85
Copy link

No entiendo el propósito del código. Al parecer anda pero imagino que por validar vos te referías a otra cosa?

@fernandezpablo85
Copy link

Si la idea es reimplementar Promise, se me ocurre que va más por este lado (esta implementación es incompleta porque no maneja los errores que creo Promise hace con catch. Tampoco soporta encadenamientos de then. Pero puede servir como una primera versión para implementar el resto:

type Callback<T> = (t: T) => void;
type Resolver<T> = (t: T) => void;
type Rejecter = (any) => void;
type ConstructorFunction<T> = (r: Resolver<T>, rr: Rejecter) => void;

class Future<T> {
  private callbacks: Callback<T>[] = [];
  private solved = false;
  private result: T;

  constructor(cf: ConstructorFunction<T>) {
    cf(this.solve, this.reject);
  }

  solve(t: T) {
    this.result = t;
    for (let c of this.callbacks) {
      c(t);
    }
  }

  reject(_reason: any) {
    // call
  }

  then(callback) {
    if (this.solved) {
      callback(this.result);
    } else {
      this.callbacks.push(callback);
    }
  }
}

new Promise<number>((resolve, reject) => {
  resolve(1);
  reject("foo");
});

new Future<number>((resolve, reject) => {
  resolve(1);
  reject("bar");
});

@vituchon
Copy link
Author

vituchon commented Apr 17, 2023

FAaaaa muy interesante lo que me dejas de código @fernandezpablo85 . No era mi intención reemplazar a las Promises... aunque me gusta la propuesta que haces con Futures (como se nota que estuviste en Scala jajaja, pues sospecho que el sinonimo Promesa = Future viene de ese lenguaje...).

Mi intención era saber si estaba bien la reimplementación de defer. El tema con las promesas nativas es que tenés que poner todo dentro de la función que pasas como argumento al Promise.New te puede complicar o hacer dificil combinarlo con otras porciones de código.

Sea como sea... te zarpaste! gracias amigo!!!

@fernandezpablo85
Copy link

fernandezpablo85 commented Apr 17, 2023 via email

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment