簡體   English   中英

如何在rxjs中模仿“帶有承諾的回調”功能參數?

[英]How to mimic a “callback with promise” function parameter in rxjs?

我是絕對的rxjs初學者。 為了讓我開始學習觀察性思維,我需要通過代碼示例來翻譯概念。 我覺得如果可以看到它的代碼,就可以與其他概念一起開始這樣做。

不想轉換一個承諾可觀察到的,我要讓使用而觀察到的新的實現,可以表現得像一個承諾。 如何使用Observables重寫以下內容?

 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

這可能是毫無頭緒的問題,但是我已經閱讀了有關rxjs的10個不同的簡介,而這還沒有完全被點擊。 我只需要將此場景映射到可觀察的模式,我想我就可以理解。

基本上,我想定義一個可觀察函數myObs() ,它不會“立即執行”,而是在執行someMethod(message:string,obs:Observable)時“執行”。 當執行myObs ,它應該在其中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)

要么

Rx.Observable.of(""message one!", "message two!")
  .subscribe(console.log.bind(console), noop, noop)

其中noop是不執行任何noop的函數,即function noop(){}

簡而言之,您的流發出數據,該數據流通過一系列運算符,並且數據流由.subscribe啟動。 對於您的情況,您對訂閱沒有任何興趣,因為您所做的只是日志記錄。

Rxjs Streams實際上是基於后台的回調。 您想查看此答案以了解它。

我在指南的幫助下解決了該問題

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();
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM