是否可以在此示例中使用承诺

Is it possible to use promises for this example?

本文关键字:承诺 是否      更新时间:2023-09-26

我基本上是在尝试编写一个非常基本的程序,它将像这样工作:

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

我一直在尝试弄清楚如何在不使用 prompt npm 模块的情况下在 Node 中做这样的事情。

我对此的尝试是:

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}`)
  })
})

但是,这种嵌套方式似乎很奇怪,无论如何我可以在不像这样嵌套的情况下做到这一点以获得正确的顺序吗?

zangw 的回答就足够了,但我想我可以说得更清楚:

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)

如果你不关心它是否按顺序问这两个问题,你可以做:

//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)

下面是一个带有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}`)
    });
});

或者使用简单的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}`)
    });    
});

有一种方法可以在没有承诺的情况下做到这一点。

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}`)
    }
}

看,没有嵌套,但正确重构了函数。您可以并且应该对返回承诺的 API 执行相同的操作。匿名函数是该语言的一个很好的功能,但这并不意味着您必须将其用于所有事情。