Can promises be used for this example?

Basically, I am trying to write a very basic program that will work as follows:

Enter your name: _ Enter your age: _ Your name is <name> and your age is <age>. 

I tried to figure out how to do something like this in Node without using the prompt npm module.

My attempt:

 import readline from 'readline' const rl = readline.createInterface({ input: process.stdin, output: process.stdout }) rl.question('What is your name? ', (name) => { rl.question('What is your age? ', (age) => { console.log(`Your name is ${name} and your age is ${age}`) }) }) 

However, this nested way of doing this seems weird, is there anyway I can do it without making it nested, how is it to get the correct order?

+5
source share
3 answers

zangw's answer would be enough, but I think I can make it clearer:

 import readline from 'readline' const rl = readline.createInterface({ input: process.stdin, output: process.stdout }) function askName() { return new Promise((resolve) => { rl.question('What is your name? ', (name) => { resolve(name) }) }) } function askAge(name) { return new Promise((resolve) => { rl.question('What is your age? ', (age) => { resolve([name, age]) }) }) } function outputEverything([name, age]) { console.log(`Your name is ${name} and your age is ${age}`) } askName().then(askAge).then(outputEverything) 

if you don't care that he asks both questions sequentially, you could do:

 //the other two stay the same, but we don't need the name or the arrays now function askAge() { return new Promise((resolve) => { rl.question('What is your age? ', (age) => { resolve(age) }) }) } Promise.all([askName, askAge]).then(outputEverything) 
+9
source

Here is one example with Q

 var readline = require('readline'); var Q = require('q'); const rl = readline.createInterface({ input: process.stdin, output: process.stdout }); var q1 = function () { var defer = Q.defer(); rl.question('What is your name? ', (name) => { defer.resolve(name); }); return defer.promise; }; q1().then(function(name) { rl.question('What is your age? ', (age) => { console.log(`Your name is ${name} and your age is ${age}`) }); }); 

Or with a simple Promise

 function question1() { return new Promise(function(resolve) { rl.question('What is your name? ', (name) => { resolve(name); }); }); }; question1().then(function(name) { rl.question('What is your age? ', (age) => { console.log(`Your name is ${name} and your age is ${age}`) }); }); 
+2
source

There is a way to do this without promises.

 rl.question('What is your name? ', getUserName); function getUserName (name) { rl.question('What is your age? ', getUserAge(name)); } function getUserAge (name) { return function (age) { console.log(`Your name is ${name} and your age is ${age}`) } } 

Look, not nested, but correctly edited functions. You can and should do the same with api that return promises. Anonymous functions are a good language feature, but that does not mean that you should use it for everything.

-3
source

Source: https://habr.com/ru/post/1240739/


All Articles