No tienes acceso a esta clase

¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera

ES12: promise-any y métodos privados

32/35
Recursos

Las siguientes características de ES12 o ES2021 que aprenderás son: métodos privados en clases y Promise.any.

Métodos privados de clases

Los métodos privados consiste en limitar el acceso a propiedades y métodos agregando el caracter numeral ( #). Por defecto, las propiedades y métodos de una clase en JavaScript son públicas, es decir, se puede acceder a ellos fuera de la clase.

class Clase {
  #private(valor){
    console.log(valor)
  }
  
  public(valor){
    console.log(valor)
  }
}

const clase = new Clase()
clase.public("Hola")  // 'Hola'
clase.private("Hola") // TypeError: clase.private is not a function

Promise.any

Promise.any() es otra forma de manejar varias promesas, que retornará la primera promesa que sea resuelta y rebotará si todas las promesas son rechazadas.

const promesa1 = Promise.reject("Ups promesa 1 falló")
const promesa2 = Promise.reject("Ups promesa 2 falló")
const promesa3 = Promise.resolve("Promesa 3")


Promise.any([promesa1, promesa2, promesa3])
    .then(respuesta => console.log(respuesta)) // Promise 3
    .catch(error => console.log(error))

Contribución creada por Andrés Guano (Platzi Contributor).

Aportes 24

Preguntas 7

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad?

Hola Chic@s 😃

ES12:

  • Promise-any
const promise1 = new Promise((resolve, reject) => reject("reject"));
const promise2 = new Promise((resolve, reject) => resolve("resolve"));
const promise3 = new Promise((resolve, reject) => resolve("resolve2"));

Promise.any([promise1, promise2, promise3])
.then(response => console.log(response));

  • Métodos privados
// declaracion de una clase
class User {};
// genera una instancia
//const newUser = new User ();

class user {
 // metodos
greeting() {
    return "hello";
}
};

const gndx = new user();
console.log(gndx.greeting());
const bebeloper = new user();
console.log(bebeloper.greeting());

// constructor

class user { 
    constructor() {
        console.log("Nuevo usuario");
    }
    greeting() {
        return "hello";
    }
}

const david = new user();

// this

class user {
    constructor(name) {
        this.name = name;
    }
    // metodos
    speak() {
        return "Hello";
    }
    greeting() {
        return `${this.speak()} ${this.name}`;
    }
}
const ana = new user("Ana");
console.log(ana.greeting());

// setters getters

class user {
    //constructor
    constructor(name, age) {
        this.name = name;
        this.age = age
    }
    // metodos
    #speak() {
        return "Hello";
    }
    greeting() {
        return `${this.speak()} ${this.name}`;
    }

    get #uAge() {
        return this.age;
    }
    set #uAge(n) {
        this.age = n;
    }
}

const bebeloper1 = new user ("david", 15);
console.log(bebeloper1.uAge);
console.log(bebeloper1.uAge = 20);

Promise.any va a capturar la respuesta de la primera que sea de forma satisfactoria.
Si es reject la ignora y devuelve el primer resolve.

Metodos privados: Agregando # los métodos se vuelven privados y solo pueden ser accedidos dentro de la misma clase.

Me arrojaba este error, se soluciona actualizando Node.js, el método Promise.any fue compatible con node.js 15.0.0, por lo que puede actualizarla

TypeError: Promise.any is not a function                                                                                   
    at PromiseAnyService.validateAll_Type1 (E:\typescript-2020-1\promise-usages-1\lib\basics1\promise-any.service.js:18:17)
    at Object.<anonymous> (E:\typescript-2020-1\promise-usages-1\lib\test.js:35:7)                                         
    at Module._compile (internal/modules/cjs/loader.js:1137:30)                                                            
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:1157:10)                                              
    at Module.load (internal/modules/cjs/loader.js:985:32)                                                                 
    at Function.Module._load (internal/modules/cjs/loader.js:878:14)                                                       
    at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:71:12)                                    
    at internal/main/run_main_module.js:17:47                                                                              
 ERROR  Command failed with exit code 1.  ****

Creo que el Promise.any se ve mucho mas interesante de la siguiente manera:

const promise1 = new Promise((resolve, reject) => reject("Reject"));
const promise2 = new Promise((resolve, reject) =>
    setTimeout(() => {
        resolve("resolve promise 2");
    }, 1000)
);
const promise3 = new Promise((resolve, reject) => resolve("resolve promise 3"));

Promise.any([promise1, promise2, promise3]).then(
    (response) => console.log(response) // resolve promise 3 -> captures the first resolve that happens
);

De esta forma vemos que efectivamente capatura promise3 ya que se ejecuta primero que promise2

Los privados en JS se sugerían con el _ al inicio de las variables, con el # ahora si son realmente privados, aunque, ahi tienes TypeScript 😉

El uso de # puede ser importante cuando se trabaja con POO para lograr encapsulamiento. Aquí dejó cómo se vería el ejemplo de la clase utiliazándolo:

class User {
  #name
  #age
  // Constructor
  constructor(name, age) {
    this.#name = name
    this.#age = age
  }
  // Métodos
  #speak() {
    return "Hello"
  }
  greeting() {
    return `${this.#speak()} ${this.#name}`
  }
  get age() {
    return this.#age
  }
  set age(n) {
    this.#age = n
  }
}

Como que hizo falta un ejemplo de como llamar este método privado o como llamar al getter / setter, solo se volvió privado pero en ningún momento se hacía el ejemplo de llamarlo desde dentro de la misma clase ¿O no? 🤨🤨🤨

ES12: promise-any y métodos privados

Aquí tienes una explicación sobre las características “Promise.any” y los “métodos privados”, introducidos en ECMAScript 12 (ES2021):


Promise.any:


La función Promise.any es una adición a las funcionalidades relacionadas con las promesas en JavaScript. Permite que una lista de promesas se resuelva tan pronto como una de las promesas se cumpla. Si todas las promesas son rechazadas, entonces se devuelve un error.

Ejemplo de uso de Promise.any:

const promises = [
  fetch('https://api.example.com/data-1'),
  fetch('https://api.example.com/data-2'),
  fetch('https://api.example.com/data-3')
];

Promise.any(promises)
  .then(result => {
    console.log('Se cumplió al menos una promesa:', result);
  })
  .catch(error => {
    console.error('Todas las promesas fueron rechazadas:', error);
  });


En este ejemplo, Promise.any se resuelve tan pronto como una de las promesas dentro del arreglo se cumple. Si todas las promesas son rechazadas, se captura el error.


Métodos Privados:


Los “métodos privados” son métodos de una clase en JavaScript que solo pueden ser accedidos y llamados desde dentro de la misma clase. Esto ayuda a encapsular la lógica interna de la clase y evita que sean utilizados directamente desde fuera de la misma.

Sintaxis de un método privado:

class MiClase {
  #metodoPrivado() {
    // Este es un método privado
  }

  metodoPublico() {
    // Este es un método público que puede acceder al método privado
    this.#metodoPrivado();
  }
}


En este ejemplo, #metodoPrivado es un método privado dentro de la clase MiClase. Solo puede ser llamado desde otros métodos dentro de la misma clase, como metodoPublico.

Es importante tener en cuenta que los métodos privados utilizan la notación # antes del nombre del método para indicar su privacidad.

Recuerda que las características mencionadas están disponibles en ECMAScript 12 (ES2021) en adelante, por lo que debes asegurarte de que el entorno en el que estás ejecutando tu código sea compatible con ellas.

Espero sea de utilidad. 👨‍💻

Uno de los principios más importantes de la programación orientada a objetos: delimitar la interfaz interna de la externa.

Esa es una práctica “imprescindible” en el desarrollo de algo más complejo que una aplicación “hola mundo”.

Para entender esto, alejémonos del desarrollo y volvamos nuestros ojos al mundo real…

Por lo general, los dispositivos que estamos usando son bastante complejos. Pero delimitar la interfaz interna de la externa permite usarlas sin problemas.

Un ejemplo de la vida real

Por ejemplo, una máquina de café. Simple desde el exterior: un botón, una pantalla, algunos agujeros… Y, seguramente, el resultado: ¡excelente café! 😃

!https://es.javascript.info/article/private-protected-properties-methods/coffee.jpg

Pero adentro… (una imagen del manual de reparación)

!https://es.javascript.info/article/private-protected-properties-methods/coffee-inside.jpg

Muchos detalles. Pero podemos usarlo sin saber nada.

Las cafeteras son bastante confiables, ¿no es así? Podemos usarlos por años, y solo si algo sale mal, tráigalo para repararlo.

El secreto de la fiabilidad y la simplicidad de una máquina de café: todos los detalles están bien ajustados y ocultos en su interior.

Si retiramos la cubierta protectora de la cafetera, su uso será mucho más complejo (¿dónde presionar?) Y peligroso (puedes electrocutarte).

Como veremos, en la programación los objetos son como máquinas de café.

Pero para ocultar detalles internos, no utilizaremos una cubierta protectora, sino una sintaxis especial del lenguaje y las convenciones.

Interfaz interna y externa

En la programación orientada a objetos, las propiedades y los métodos se dividen en dos grupos:

  • Interfaz interna – métodos y propiedades, accesibles desde otros métodos de la clase, pero no desde el exterior.
  • Interfaz externa – métodos y propiedades, accesibles también desde fuera de la clase.

Si continuamos la analogía con la máquina de café, lo que está oculto en su interior: un tubo de caldera, un elemento calefactor, etc., es su interfaz interna.

Se utiliza una interfaz interna para que el objeto funcione, sus detalles se utilizan entre sí. Por ejemplo, un tubo de caldera está unido al elemento calefactor.

Pero desde afuera, una máquina de café está cerrada por la cubierta protectora, para que nadie pueda alcanzarlos. Los detalles están ocultos e inaccesibles. Podemos usar sus funciones a través de la interfaz externa.

Entonces, todo lo que necesitamos para usar un objeto es conocer su interfaz externa. Es posible que no seamos completamente conscientes de cómo funciona dentro, y eso es genial.

Esa fue una introducción general.

En JavaScript, hay dos tipos de campos de objeto (propiedades y métodos):

  • Público: accesible desde cualquier lugar. Comprenden la interfaz externa. Hasta ahora solo estábamos usando propiedades y métodos públicos.
  • Privado: accesible solo desde dentro de la clase. Estos son para la interfaz interna.

En muchos otros lenguajes también existen campos “protegidos”: accesibles solo desde dentro de la clase y aquellos que lo extienden (como privado, pero más acceso desde clases heredadas). También son útiles para la interfaz interna. En cierto sentido, están más extendidos que los privados, porque generalmente queremos que las clases heredadas tengan acceso a ellas.

Los campos protegidos no se implementan en JavaScript a nivel de lenguaje, pero en la práctica son muy convenientes, por lo que se emulan.

Ahora haremos una máquina de café en JavaScript con todos estos tipos de propiedades. Una máquina de café tiene muchos detalles, no los modelaremos todos, seremos simples (aunque podríamos).

Proteger “waterAmount”

Hagamos primero una clase de cafetera simple:

class CoffeeMachine {
	waterAmount = 0; // la cantidad de agua adentro

	constructor(power) {
		this.power = power;
		alert( `Se creó una máquina de café, poder: ${power}` );
	}
}

// se crea la máquina de café
let coffeeMachine = new CoffeeMachine(100);

// agregar agua
coffeeMachine.waterAmount = 200;

En este momento las propiedades waterAmount ypower son públicas. Podemos obtenerlos/configurarlos fácilmente desde el exterior a cualquier valor.

Cambiemos la propiedad waterAmount a protegida para tener más control sobre ella. Por ejemplo, no queremos que nadie lo ponga por debajo de cero.

Las propiedades protegidas generalmente tienen el prefijo de subrayado _.

Eso no se aplica a nivel de lenguaje, pero existe una convención bien conocida entre los programadores de que no se debe acceder a tales propiedades y métodos desde el exterior.

Entonces nuestra propiedad se llamará _waterAmount:

class CoffeeMachine {
	_waterAmount = 0;

	set waterAmount(value) {
		if (value < 0) {
			value = 0;
		}
		this._waterAmount = value;
	}

	get waterAmount() {
		return this._waterAmount;
	}

	constructor(power) {
		this._power = power;
	}
}

// se crea la máquina de café
let coffeeMachine = new CoffeeMachine(100);

// agregar agua
coffeeMachine.waterAmount = -10; // _waterAmount se vuelve 0, no -10

Ahora el acceso está bajo control, por lo que establecer una cantidad de agua por debajo de cero se volvió imposible.

“Power” de solo lectura

Para la propiedad power, hagámoslo de solo lectura. A veces sucede que una propiedad debe establecerse solo en el momento de la creación y nunca modificarse.

Ese es exactamente el caso de una máquina de café: la potencia nunca cambia.

Para hacerlo, solo necesitamos hacer getter, pero no setter:

class CoffeeMachine {
	// ...

	constructor(power) {
		this._power = power;
	}

	get power() {
		return this._power;
	}
}

// se crea la máquina de café
let coffeeMachine = new CoffeeMachine(100);

alert(`La potencia es: ${coffeeMachine.power}W`); // Potencia es: 100W

coffeeMachine.power = 25; // Error (sin setter)

“waterLimit” Privada

Hay una propuesta de JavaScript terminada, casi en el estándar, que proporciona soporte a nivel de lenguaje para propiedades y métodos privados.

Los privados deberían comenzar con #. Solo son accesibles desde dentro de la clase.

Por ejemplo, aquí hay una propiedad privada #waterLimit y el método privado de control de agua #fixWaterAmount:

class CoffeeMachine {
	*#waterLimit = 200;

	#fixWaterAmount(value) {
		if (value < 0) return 0;
		if (value > this.#waterLimit) return this.#waterLimit;
	}*

	setWaterAmount(value) {
		this.#waterLimit = this.#fixWaterAmount(value);
	}
}

let coffeeMachine = new CoffeeMachine();

*// no puede acceder a privados desde fuera de la clase
coffeeMachine.#fixWaterAmount(123); // Error
coffeeMachine.#waterLimit = 1000; // Error*

A nivel de lenguaje, # es una señal especial de que el campo es privado. No podemos acceder desde fuera o desde clases heredadas.

Los campos privados no entran en conflicto con los públicos. Podemos tener campos privados #waterAmount y públicos waterAmount al mismo tiempo.

Por ejemplo, hagamos que waterAmount sea un accesorio para #waterAmount:

class CoffeeMachine {
	#waterAmount = 0;

	get waterAmount() {
		return this.#waterAmount;
	}

	set waterAmount(value) {
		if (value < 0) value = 0;
		this.#waterAmount = value;
	}
}

let machine = new CoffeeMachine();

machine.waterAmount = 100;
alert(machine.#waterAmount); // Error

A diferencia de los protegidos, los campos privados son aplicados por el propio lenguaje. Eso es bueno.

Pero si heredamos de CoffeeMachine, entonces no tendremos acceso directo a #waterAmount. Tendremos que confiar en el getter/setter de waterAmount:

class MegaCoffeeMachine extends CoffeeMachine {
	method() {
		*alert( this.#waterAmount ); // Error: solo se puede acceder desde CoffeeMachine*
	}
}

En muchos escenarios, esta limitación es demasiado severa. Si ampliamos una CoffeeMachine, es posible que tengamos razones legítimas para acceder a sus componentes internos. Es por eso que los campos protegidos se usan con más frecuencia, aunque no sean compatibles con la sintaxis del lenguaje.

También es posible usar atributos privados en las clases de la misma forma en que se definen los metodos privados 😃.

class Person {
  #name; // Private attribute

  constructor(name) {
    this.#name = name; // Initialize the private attribute in the constructor
  }

  getName() {
    return this.#name;
  }

  changeName(newName) {
    this.#name = newName;
  }
}

Promise.any() es una forma de manejar varias promesas en JavaScript que retorna la primera promesa que se resuelve y rechaza si todas las promesas son rechazadas[1][5]. Por otro lado, los métodos privados son métodos que solo son accesibles dentro de la clase en la que se definen y no pueden ser accedidos desde fuera de la clase[6]. En JavaScript, los campos privados se pueden implementar utilizando la sintaxis # antes del nombre del campo[6].

En resumen, Promise.any() es una forma de manejar varias promesas en JavaScript que retorna la primera promesa que se resuelve y los métodos privados son métodos que solo son accesibles dentro de la clase en la que se definen y no pueden ser accedidos desde fuera de la clase. En JavaScript, los campos privados se pueden implementar utilizando la sintaxis # antes del nombre del campo.

```js //setters and getters class User{ // constructor constructor(name, age){ this.name = name; this.age = age; } // method #speak(){ return 'Hello my name is'; } //method greeting(){ return `${this.speak()} ${this._name}`; } get #uAge(){ return this.age; } set #uAge(newAge){ this.age = newAge; } } const juanPerez = new User('David', 55); console.log(juanPerez.uAge); console.log(juanPerez.uAge=20); ```*const promise1 = new Promise((*resolve*,* reject*) => resolve(*'success'*))*;*const promise2 = new Promise((*resolve*,* reject*) => reject(*'reject'*))*;*const promise3 = new Promise((*resolve*,* reject*) => resolve(*'success'*))*; Promise.*any*(\[promise1, promise2, promise3]).*then*(response *=>* *console*.*log*(response));```js const promise1 = new Promise((resolve, reject) => resolve('success')); const promise2 = new Promise((resolve, reject) => reject('reject')); const promise3 = new Promise((resolve, reject) => resolve('success')); Promise.any([promise1, promise2, promise3]) .then(response => console.log(response)); ```

Hola a todos!, no se, a cuantos les habra funcionado a la primera el “Promise.any”, a mi en lo personal no me funciono, al parecer, no teneia una version actualizada de Node.js.
Y en el proceso de busqueda, encontre esta pagina:
https://node.green/
Muy util, colocan informacion de las actualizaciones por version.
Espero sea de ayuda a alguien.

En el exámen a final del curso en la pregunta sobre , cual de las opciones no es una característica sobre las nuevas funcionalidades de ECMAScript en 2021, o sea ECMAScript 12, si no estoy mal, todas las opciones se implementaron en esa versión, a alguien más le pasó?

🔏 Archivos del Proyecto 🔏


 

Pasos 📌

 

  • • Dentro de la carpeta es12, crear el archivo llamado: 02-promise-any.js
      • ◦ El código queda:
//Compilar: seleccionar el código + click derecho + Run Code

//Ejercicio #1
const promise1 = new Promise((resolve, reject) => reject("reject"));
const promise2 = new Promise((resolve, reject) => resolve("resolve"));
const promise3 = new Promise((resolve, reject) => resolve("resolve 2"));

Promise.any([promise1, promise2, promise3])
	.then(response => console.log(response));

/*output: muestra la primera promesa que se se resuelva
resolve
*/

 

  • • Dentro de la carpeta es12, crear el archivo llamado: 03-private.js
      • ◦ El código queda:
//Compilar: seleccionar el código + click derecho + Run Code

//Ejercicio #1

class user{
	//constructor
	constructor(name,age){
		this.name = name;
		this.age = age;
	}
	//metodos
	#speak(){ //al colocar # el metodo se vuelve privado
		return 'Hello';
	}
	greeting(){
		return `${this.speak()} ${this.name}`;
	}
	get #uAge(){
		return this.age;
	}
	set #uAge(n){
		this.age = n;
	}
}
const bebeloper = new user('David', 15);
console.log(bebeloper.uAge);
console.log(bebeloper.uAge = 20);

/*output: no puede entrar a los metodos privados
undefined
20
*/

waos, métodos privados uwu

Mi resumen:

32/35 ES12: promise-any y métodos privados
Los métodos privados de una clase en JavaScript son métodos que están restringidos solo a su clase y no pueden ser accedidos desde fuera de ella. Para declarar un método privado, se debe usar el símbolo # seguido del nombre del método. Ejemplo:

class MiClase {
  #metodoPrivado() {
    console.log("Soy un método privado");
  }

  metodoPublico() {
    console.log("Soy un método público");
    this.#metodoPrivado();
  }
}

const instancia = new MiClase();
instancia.metodoPublico(); // "Soy un método público" y 
//"Soy un método privado" se imprimen en la consola
instancia.#metodoPrivado(); // ERROR - No se puede acceder al 
//método privado desde fuera de la clase

En este ejemplo: #metodoprivado() es un método privado y solo puede ser llamado dentro de la clase ‘MiClase’, ‘métodoPublico()’ es un método público que puede ser llamado desde fuera de la clase y llama al método privado

En caso de que todas las promesas fallen con Promise.any(), se tienen estas opciones para validar:

/*Si todas las promesas fallan */

  Promise.any([Promise.reject("Aquí puede ir una funcion, false (boolean), valor numerico 0, un mensaje personalizado, etc")])
  .catch((e) => {
    console.log(e instanceof AggregateError); // true
    console.log(e.message, typeof e.message); // "All Promises rejected" "string"
    console.log(e.name, typeof e.name);  // "AggregateError" "string"
    console.log(e.errors, e.errors[0]); // Aquí puede ir una funcion, false (boolean), valor numerico 0, un mensaje personalizado, etc
  });

Les recomiendo este video donde sí explican acerca de los private fields. 😄

yo particularmente pensé que el any hacia que todos se ejecuten a la par y el primero que se resuelva es el que devuelve pero NO, se ejecutan en orden acorde al array que le pasas y el primer resolve que encuentre es el que devuelve

alguien mas tiene problemas con el code runner? a mi me da resultados diferentes a los que me da la consola, alguien sabe como spuedo solucionarlo? gracias!!!

Que buenos metodos

 //Metodo privado------------------------------------------
    //Solo se puede acceder a este metodo desde dentro de la clase
    #metodoPrivado()
    {
        console.log("Hola, soy un metodo privado");
    }