如何将一个Observable解析为另一个Observer?-rxjs

How do I resolve an Observable inside of another Observable? - rxjs

本文关键字:另一个 Observer -rxjs Observable 一个      更新时间:2023-09-26

我有一个Observable,在其中我消耗了另一个可观察到的,但第二个Observable我无法解析。这是代码:

return Observable.fromPromise(axios(config))
        .map(res => {
            return {
                accessToken: res.data.access_token,
                refreshToken: res.data.refresh_token                
            }
        })
        .map(res => {
            return {
                me: getMe(res.accessToken),
                accessToken: res.accessToken,
                refreshToken: res.refreshToken                
            }
        })
function getMe(accessToken) {
    return Observable.fromPromise(axios.get({
        url: 'https://api.spotify.com/v1/me',
    }));
}

getMe函数返回一个Observable,但它从未被解析。我尝试添加一个flatMap和一个concat,但仍然没有解决。如何解决getMe

您是否尝试了以下操作(同样未经测试):

function getMe(accessToken) {
  return Rx.Observable.fromPromise(axios.get({
    url: 'https://api.spotify.com/v1/me',
  }));
}    
Rx.Observable.fromPromise(axios(config))
    .map((res) => {
        return {
            accessToken: res.data.access_token,
            refreshToken: res.data.refresh_token                
        }
    })
    .flatMap((res) => {
        return getMe(res.accessToken).map((res2) => {
          res.me = res2;
          return res;
        }
    })
    .subscribe((data) => console.log(data));

正如上面文章中提到的,flatMap返回了一个observable。CCD_ 9随后用于将CCD_ 10与从第二承诺返回的结果CCD_。

还要注意,fromPromise是一个冷的可观测到的。这意味着你必须有一个订阅才能发起活动。在你的情况下,我想你已经有了这样的东西:

someFunction = () => {
  return Rx.Observable.fromPromise(axios(config))
     ...
     ...
}
someFunction.subscribe((data) => console.log(data));

正如@user3743222所指出的,Observable不像Promise那样是resolve。如果你想要getMe方法的值,你需要订阅它返回的Observable

return Observable.fromPromise(axios(config))
        .map(res => {
            return {
                accessToken: res.data.access_token,
                refreshToken: res.data.refresh_token                
            }
        })
        .flatMap(function(tokens) {
          //FlatMap can implicitly accept a Promise return, so I showed that here
          //for brevity
          return axios.get({url : 'https://api.spotify.com/v1/me'});
        },
        //The second method gives you both the item passed into the first function
        //paired with every item emitted from the returned Observable`
        //i.e. axios.get(...)
        function(tokens, response) {
          return {
            accessToken: tokens.accessToken,
            refreshToken: tokens.accessToken,
            //Here response is a value not an Observable
            me: response
          };
        });

下面要查找的示例代码(UNTESTED!!)。一些解释:

  • CCD_ 18返回的可观测值不平坦("求解"属于承诺世界),因为CCD_ 19算子不平坦可观测值。flatMap可以,但您需要以source.flatMap(function(x){return observable})的形式使用它,这里返回的是POJO而不是Rx.Observable
  • 因此,为了使getMe变平,我们使用flatMap
  • 为了加回丢失的字段(accessTokenrefreshToken),我们在发射res对象(res$)的可观察对象上使用withLatestFrom
  • 我们使用share,因为我们订阅了两次res$,并且我们希望所有订阅者都能看到相同的值。

    var res$ = Observable
      .fromPromise(axios(config))
      .map(function ( res ) {
           return {
             accessToken  : res.data.access_token,
             refreshToken : res.data.refresh_token
           }
         })
      .share();
    var getMe$ = res$.flatMap(function ( res ) {return getMe(res.accessToken)});
    var finalRes$ = getMe$.withLatestFrom(res$, function ( getMe, res ) {
    return {
       me           : getMe,
       accessToken  : res.accessToken,
       refreshToken : res.refreshToken
     }
    });
    function getMe ( accessToken ) {
      return Observable.fromPromise(axios.get({url : 'https://api.spotify.com/v1/me'}));
    }