Javascript 如何模仿“a”;“有承诺的回访”;rxjs中的函数参数?

Javascript 如何模仿“a”;“有承诺的回访”;rxjs中的函数参数?,javascript,rxjs,reactive-programming,observable,Javascript,Rxjs,Reactive Programming,Observable,我绝对是rxjs的初学者。对于我来说,要开始学习在可观察事物中思考,我需要通过代码示例来翻译概念。我觉得如果我能看到这方面的代码,我就可以开始用其他概念自己做这件事 我不想把一个承诺转换成一个可观察的,我想用一个可观察的来做一个新的实现。我将如何使用可观测数据重新编写以下内容 constructor(){ let makeMessage2 = function(){ return new Promise(resolve, reject){ setT

我绝对是rxjs的初学者。对于我来说,要开始学习在可观察事物中思考,我需要通过代码示例来翻译概念。我觉得如果我能看到这方面的代码,我就可以开始用其他概念自己做这件事

我不想把一个承诺转换成一个可观察的,我想用一个可观察的来做一个新的实现。我将如何使用可观测数据重新编写以下内容

 constructor(){
    let makeMessage2 = function(){
        return new Promise(resolve, reject){
           setTimeout(()=>{
                  var r = Math.random();
                  resolve("message two plus random value: " + r );
           }, 1000);
        }
    }
    this.logMessageAndResultOfCallback("message one!", makeMessage2);
}
private sideEffect1:string = "";
private sideEffect2:string = "";

logMessageAndResultOfCallback( message1:string, callback:Function ){
    console.log(message1);
    this.sideEffect1 = message1;

    callback().then((message2)=>{
          console.log(message2);
          this.sideEffect2 = message2;
    }
}
我想我不明白的部分是如何定义“回调”函数,如何调用它。我知道我会等待完成或发出处理程序,比如
makeMessage2().subscribe(message2=>console.log(message2))但我不知道如何定义
makeMessage2

这可能是一个毫无头绪的问题,但我已经阅读了大约10个不同的rxjs介绍,这还没有完全点击。我只需要将这个场景映射到可观察的模式,我想我能理解它

基本上,我想定义一个可观察函数
myObs()
,它不“立即执行”,而是在执行
somethod(message:string,obs:observable)
时“执行”。当执行
myObs
时,它应该在其中同步执行某些操作(如获取HTTP请求的结果),然后设置下一个值,然后触发complete(),这样我在
someMethod
中定义的观察者就可以处理完成的操作,并对结果进行处理


编辑:我不关心rxjs中的计时器或本机等价物,这只是为了模拟任何异步操作,比如从服务器获取数据

您编写并希望“翻译”为可观察对象的代码可能无法工作
callback
是一个承诺,而不是一个函数,因此您不能编写
callback()

你也试过这个吗?这对很多人都有效

要回答你的问题,你可以写

Rx.Observable.of(""message one!", "message two!")
  .map(console.log.bind(console)) // would be better to use `do` operator actually, for semantic reasons, but that works the same here
  .subscribe(noop, noop, noop)

其中
noop
是一个不做任何事情的函数,即
function noop(){}

简言之,您的流发出数据,该数据流通过一系列操作符,数据流由
.subscribe
启动。在您的情况下,订阅没有什么有趣的事情要做,因为您所做的只是日志记录


Rxjs流实际上是基于回调的。您需要检查以了解它。

我在向导的帮助下解决了它


Oops,意味着生成一个返回承诺的函数。编辑代码。我想这不是我要找的。预期的用例是一个具有一些初始副作用(logs message1)的函数,需要使用异步解析调用“回调”。该回调的解析需要调用回调函数内部不可知的行为/副作用。我不是简单地打印两条信息。不,我需要副作用。你的例子做不到这一点。我只是让我的例子有具体的副作用来说明。我添加了我的尝试。这似乎与我提出的模式相匹配吗?
可观察。create
接受订户函数——它对订户执行。这对你不管用吗?你的问题不是很清楚。在rxjs文档网站上,有一个很好的向导,介绍如何从不同的东西开始观察“承诺回调模式”,这也很混乱。。通常这是异步代码的两种不同方法,因此,我最终做了自己的尝试。这看起来正确吗?确切地说,这可能是两种异步行为。在我的用例中,它是在“回调”计算完成后关闭UI项,但在用户操作之前不调用回调。是的,这就是我的意思。仅供参考,但对于这个示例,尽管您根本不需要设置超时,但有内置的rx操作符
delayTime
Rx.Observable.of(""message one!", "message two!")
  .subscribe(console.log.bind(console), noop, noop)
import {Observable} from 'rxjs';
var makeMessage2 = Observable.create(observer => {
  // Yield a single value and complete
  setTimeout(function(){
     let r = Math.random();
     observer.next("message two plus random value: " + r );
     observer.complete();
  }, 1000);
  return () => console.log('disposed')
});
logMessageAndResultOfCallback( "some message one", makeMessage2);


logMessageAndResultOfCallback( message1:string, callback:Observeable ){
    console.log(message1);
    this.sideEffect1 = message1;

    var subscription = callback.subscribe(
       (value)=>{this.sideEffect2 = value;},
       (e) =>{ console.log('onError: %s', e)},
       () => {console.log(this.sideEffect2);});
      subscription.dispose();
}