Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在CLI应用程序中可从Promise和交互式循环中观察到RxJS_Javascript_Node.js_Promise_Rxjs - Fatal编程技术网

Javascript 在CLI应用程序中可从Promise和交互式循环中观察到RxJS

Javascript 在CLI应用程序中可从Promise和交互式循环中观察到RxJS,javascript,node.js,promise,rxjs,Javascript,Node.js,Promise,Rxjs,我正在使用node.js构建一个简单的命令行工具 在过去,我对这样的事情使用承诺的方法 function listenCommand(){ inquirer.prompt([{ type:'input', name:'value', message:"Enter commande :" }]).then(function (command) { processCmd(command); }); } func

我正在使用node.js构建一个简单的命令行工具

在过去,我对这样的事情使用承诺的方法

function listenCommand(){
    inquirer.prompt([{
        type:'input',
        name:'value',
        message:"Enter commande :"
    }]).then(function (command) {
        processCmd(command);
    });
}

function processCmd(){
   ...
   listenCommand()
}
这将创建我的主循环来输入命令。执行命令时,应用程序将请求下一个命令

我现在尝试将其转换为RxJS方法,类似于

function listenCommand(){
    let listener = Rx.Observable.fromPromise(inquirer.prompt([{
        type:'input',
        name:'value',
        message:"Enter commande :"
    }]));

    listener.subscribe(function (command) {
        processCmd(command);
    });
}

function processCmd(){
   ...
   listenCommand()
}
这很管用,但听起来不太好


使用RxJS执行此提示循环的正确方法是什么?或者RxJS不适合这种工作,我应该坚持承诺方法吗?

您建议的第二种方法本质上是第一种方法,您刚刚将承诺包装在一个可观察的界面中。您可能希望使用
repeat/repeatWhen
运算符:

function listenCommand() {
  return Rx.Observable.defer(() => 
    inquirer.prompt([{
      type:'input',
      name:'value',
      message:"Enter commande :"
    }])
  )
  // Repeats until the end of time
  .repeat()
  .subscribe(cmd => processCommand(cmd))
}
在呼叫端,您可以通过执行以下操作随时取消操作:

const subscription = listenCommand();

subscription.unsubscribe();