-
-
Save vituchon/a72a9af8aaaadb670d09c70914f1ac34 to your computer and use it in GitHub Desktop.
| 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") |
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");
});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!!!
No entiendo el propósito del código. Al parecer anda pero imagino que por validar vos te referías a otra cosa?