Javascript 如何在执行过程中使用rxjs动态地向Inquirer JS添加问题?
我想向用户提问,但不想让所有问题立即排好队 文档中提到了rxjs,但我觉得文档中在如何在执行提示时正确添加问题方面存在差距,或者至少它对我不太起作用 在内部,Inquirer使用JS反应式扩展来处理事件 和异步流 这意味着您可以利用此功能提供更多信息 高级流。例如,您可以动态地将问题添加到 问: 使用返回值进程属性,可以访问更精细的 粒度回调:Javascript 如何在执行过程中使用rxjs动态地向Inquirer JS添加问题?,javascript,rxjs,inquirer,inquirerjs,Javascript,Rxjs,Inquirer,Inquirerjs,我想向用户提问,但不想让所有问题立即排好队 文档中提到了rxjs,但我觉得文档中在如何在执行提示时正确添加问题方面存在差距,或者至少它对我不太起作用 在内部,Inquirer使用JS反应式扩展来处理事件 和异步流 这意味着您可以利用此功能提供更多信息 高级流。例如,您可以动态地将问题添加到 问: 使用返回值进程属性,可以访问更精细的 粒度回调: 所以多亏了我的灵感,我制作了我需要的代码。jana提供的示例和提示有点过时,因为某些原因,使用rxjs中的主题不再有效,至少对我来说不起作用。但是,通
所以多亏了我的灵感,我制作了我需要的代码。jana提供的示例和提示有点过时,因为某些原因,使用rxjs中的主题不再有效,至少对我来说不起作用。但是,通过将发射器存储在观察者创建回调之外,可以很容易地解决这个问题。记住将rxjs作为依赖项添加到项目中(与InquirerJS当前使用的相同) 这个提示和博客文章应该是您开始使用时所需要的。请记住,如果您愿意,您可以一次性将多个问题排队
完成后,放入
emitter.complete()
结束提示的地方。在较新版本中,相同问题的新提示(名称
)需要askAnswered:true
)
var prompts = new Rx.Subject();
inquirer.prompt(prompts);
// At some point in the future, push new questions
prompts.next({
/* question... */
});
prompts.next({
/* question... */
});
// When you're done
prompts.complete();
inquirer.prompt(prompts).ui.process.subscribe(onEachAnswer, onError, onComplete);
const inquirer = require("inquirer");
var { Observable } = require("rxjs");
let emitter;
var prompts = Observable.create(function(e) {
emitter = e;
// need to start with at least one question here
emitter.next({
type: "list",
name: "fruits",
message: "What is your favorite fruit?",
choices: [
{
name: "Banana"
},
{
name: "Apple"
},
{
name: "Pear"
}
]
});
});
let times = 0;
inquirer.prompt(prompts).ui.process.subscribe(
q => {
let dots = new Array(times).fill(".").join("");
if (q.answer.toLowerCase() === "pear") {
console.log("That's Great. I would never forget a Pear-eater.");
emitter.complete();
}
emitter.next({
type: "list",
name: "fruits",
message:
"Sorry, what is your favorite fruit? I forgot, was it " +
q.answer +
", or something else?",
choices: [
{
name: "Uh, Banana.." + dots,
value: "banana"
},
{
name: "Uh, Apple.." + dots,
value: "apple"
},
{
name: "Pear!",
value: "pear"
}
]
});
times++;
},
error => {
console.log("Hm, an error happened. Why?");
},
complete => {
console.log("I think we are done now.");
}
);