Soy muy nuevo en NodeJS, y estoy tratando de usar promesas para solicitar al usuario que ingrese en un orden específico. Aquí está mi código:

var prompt = require('prompt');
var promising = require("promise-adapter");

var promptGet = promising(prompt.get);

prompt.start();

function Game () {
    playerOneName = '';
    playerTwoName = '';
    pOneType = true; 
}

//prompts the user for two names and assigns them 
//to player one and player to for the game object
Game.prototype.getName = function (resolve){
    promptGet(['playerName1', 'playerName2']).then(function(result){
        this.playerOneName = result.playerName1;
        this.playerTwoName = result.playerName2;
    })
    .then(function() {
        resolve();
    });
}

Game.prototype.getType = function (resolve) {
    //console.log('made it to the function');
    promptGet(['Player1Type']).then(function(result){
        if (result.Player1Type !== "X"){ this.pOneType = false;}
        //console.log(this.pOneType);
    })
    .then(function(){
        resolve();
    });
}
Game.prototype.displayPlayers = function(resolve) {
    if (pOneType === true){
        console.log(this.playerOneName + " will be X's");
        console.log(this.playerTwoName + " will be O's");
    }
    else {
        console.log(this.playerOneName + " will be O's");
        console.log(this.playerTwoName + " will be X's");
    } 
    console.log("Let's Get Started!");
}

var test = new Game();

new Promise(function(resolve, reject){
        test.getName(resolve);
    })
    .then(function(resolve, reject){
        test.getType();
    })
    .then(function(resolve, reject){
        test.displayPlayers();
    });

Sé que este es un código muy descuidado, pero aun así, creo que debería funcionar de manera que test.displayPlayers () ejecute antes test.getType (), pero no lo es. ¡Gracias por cualquier ayuda! También estoy dispuesto a escuchar consejos sobre cómo limpiar el código.

1
cbrauns 10 may. 2016 a las 16:15

3 respuestas

La mejor respuesta

No diría que las promesas son la forma de hacer esto, pero si todavía quieres usarlas, no has entendido cómo usarlas para la tarea en cuestión.

Cada bloque de código asíncrono debería devolver una promesa, y en su caso esos serían el bloqueo mientras espera las entradas del usuario.

Usted define funciones que devuelven una nueva promesa o una promesa existente y las encadena entre sí, de modo que puede controlar el orden de ejecución de su código.

Eche un vistazo al simple violín a continuación. Tenga en cuenta que getName devuelve una nueva promesa, que se construye utilizando el constructor Promise que toma un ejecutor como parámetro, que proporciona las funciones resolve y reject de la implementación de la promesa.

Cuando termine su código asincrónico, o en este caso el código de bloqueo, simplemente resuelva la promesa con o sin un valor resuelto.

Por defecto, la función .then() devuelve una nueva promesa, y si devuelve un objeto dentro de la función .then(), se resolverá automáticamente, a menos que el objeto sea una nueva promesa.

function Game() {
  var playerOneName = '';
  var playerTwoName = '';
  var pOneType = true;
}

//prompts the user for two names and assigns them 
//to player one and player to for the game object
Game.prototype.getName = function(resolve) {
  return new Promise(function(resolve, reject) {
    var playerOneName = prompt("Please enter your name", "Harry Potter");
    var playerTwoName = prompt("Please enter your name", "Ron Weasley");
    if (playerOneName !== null && playerTwoName !== null) {
      resolve();
    } else {
      reject();
    }
  });
}

var someOtherFunction = function() {
  alert("This is inside some other function!");
  return "A value that gets resolved by the promise!";
}


var testGame = new Game();
testGame.getName()
  .then(function() {
    alert("This happens when names have been chosen!");
  })
  .then(someOtherFunction)
  .then(function(resolvedValue) {
    alert(resolvedValue);
  })

A partir de esto, debería poder obtener las promesas básicas, pero le recomiendo que lea el documentación de MDN Promise.

0
Daniel B 10 may. 2016 a las 15:21

No puede depender de then para ejecutar el código en un orden específico, then es una función asincrónica. Si desea ejecutar una serie de promesas en un orden específico, eche un vistazo a Async.js. será algo como esto:

async.series([
    function(){ ... },
    function(){ ... }
]); 
1
Mahmoud El-Refaie 10 may. 2016 a las 13:40

No veo tu problema, para mí una promesa funciona como un evento.

Si realmente quieres ejecutar test.display Players () después de test.getType (); hacer algo así:

var prompt = require('prompt');
var promising = require("promise-adapter");

var promptGet = promising(prompt.get);

prompt.start();

function Game () {
    playerOneName = '';
    playerTwoName = '';
    pOneType = true; 
}

//prompts the user for two names and assigns them 
//to player one and player to for the game object
Game.prototype.getName = function (resolve){
    promptGet(['playerName1', 'playerName2']).then(function(result){
        this.playerOneName = result.playerName1;
        this.playerTwoName = result.playerName2;
    })
    .then(function() {
        resolve();
    });
}

Game.prototype.getType = function (resolve) {
    //console.log('made it to the function');
    promptGet(['Player1Type']).then(function(result){
        if (result.Player1Type !== "X"){ this.pOneType = false;}
        //console.log(this.pOneType);
    })
    .then(function(){
        resolve();
    });
}
Game.prototype.displayPlayers = function(resolve) {
    if (pOneType === true){
        console.log(this.playerOneName + " will be X's");
        console.log(this.playerTwoName + " will be O's");
    }
    else {
        console.log(this.playerOneName + " will be O's");
        console.log(this.playerTwoName + " will be X's");
    } 
    console.log("Let's Get Started!");
}

var test = new Game();

new Promise(function(resolve, reject){
        test.getName(resolve);
    })
    .then(function(resolve, reject){
        test.getType();
        test.displayPlayers();
    })
0
anthony 10 may. 2016 a las 13:38