Actualmente estoy trabajando en una prueba de concepto para una aplicación web que usarán dos usuarios. Para esto, estoy simulando el proceso dentro de la terminal (muy, muy básico).
Lo que intento hacer es demostrar la "vinculación" inicial de los dos usuarios. Creé una clase para los usuarios con múltiples propiedades. El método setUserInfo() debe ejecutarse paso a paso hasta que el usuario seleccione una preferencia de mi lista (estoy usando el paquete npm prompt-list avisos para esto) y luego esta selección debe insertarse en la matriz ownPref . Después de eso, el método receivePartnerPrefs() debería insertar el contenido de partnerExamplePrefs en la propiedad del constructor partnerPrefs .
El problema es que, si ejecuto este script, todo está bien hasta que el método list.ask() del paquete prompt-list hace lo suyo. Todos los métodos posteriores (en este caso, receivePartnerPrefs ) se ejecutan simultáneamente y rompen el proceso paso a paso que estoy tratando de mostrar aquí.
const prompt = require("prompt-sync")(); var List = require("prompt-list"); let partnerExamplePrefs = [ "Farbenfroh", "Eng geschnitten", "Schlicht und einfach", ]; let prefs = []; class User { constructor(userName, ownPref = [], socPoints, shopPartner, partnerPrefs) { this.userName = userName; this.ownPref = ownPref; this.socPoints = socPoints; this.shopPartner = shopPartner; this.partnerPrefs = partnerPrefs; } setUserInfo() { this.userName = prompt("Hallo! Wie ist dein Name? "); console.log("Hallo " + this.userName); this.socPoints = 0; this.shopPartner = prompt( "Wen möchtest du als Shopping Begleitung wählen? " ); console.log(this.shopPartner + " und du seid nun verlinkt!"); var list = new List({ name: "preferences", message: "Damit deine Shopping-Begleitungen für dich Produkte auswählen können, benötigt sie ein paar Informationen. Bitte wähle aus der folgenden Liste einen Punkt aus, der dir am Wichtigsten ist: ", choices: [ "Farbenfroh", "Schwarz-weiß", "Eng geschnitten", "Weit geschnitten", "Schlicht und einfach", "Ausgefallenes", ], }); list.ask(function (answer) { this.ownPref = prefs; this.ownPref.push(answer); }); } receivePartnerPrefs() { // Receive partner preferences this.partnerPrefs = partnerExamplePrefs; console.log( "Die Vorlieben von " + this.shopPartner + " wurden übertragen. Sämtliche Produkte die du sehen wirst, basieren auf den Vorlieben deines Partners. Nun kannst du beginnen dich mit deiner Begleitung auseinanderzusetzen!" ); } } let myUser = new User(); myUser.setUserInfo(); myUser.receivePartnerPrefs();¿Dónde está mi error en esto? ¡Gracias!
Mirando el archivo Léame de la lista de mensajes:
// async list.ask(function(answer) { console.log(answer); }); // promise list.run() .then(function(answer) { console.log(answer); }); ask es una función asíncrona. Hace lo suyo mientras otras partes de la aplicación continúan ejecutándose. Si desea esperar hasta que finalice la tarea, puede hacer el resto de lo que desea hacer dentro de la función de devolución de llamada o usar el otro método ( list.run() ) y esperar a que se resuelva la promesa antes de continuar. .
Para eso, deberá hacer que el método setUserInfo sea un método async . los métodos async devuelven una Promise por diseño que se resuelve cuando finaliza la ejecución del método. En ese método, también debe await en list.run() .
Luego, también deberá colocar la parte principal de su código dentro de una función async , por lo que podría await en el método setUserInfo() .
Tenga en cuenta que también puede salirse con la suya simplemente llamando al método y usando la notación .then para hacer las cosas solo después de que se resuelva la promesa, pero await hace que las cosas sean más legibles.
class User { constructor(...) { // ... } async setUserInfo() { // ... var list = new List({ // ... }); const answer = await list.run(); this.ownPref = prefs; this.ownPref.push(answer); } receivePartnerPrefs() { // ... } } const main = async () => { let myUser = new User(); await myUser.setUserInfo(); myUser.receivePartnerPrefs(); }; main().catch(console.error);