来自可观察的承诺不等待实现

时间:2017-12-11 13:43:40

标签: javascript rxjs

我编写了一个函数,它将通过API获得IMDB ID的IMDB评级。 这是我传递IMDB ID的功能

async function movieDetails(ID){
    let ratings= await getDetails(ID);
    return ratings;
}

这是返回IMDB评级的函数。

const getDetails = val =>{
    return Rx.Observable.fromPromise(fetch(`http://www.omdbapi.com/?i=${val}&plot=full&apikey=${APIKey}`)
    .then(e => e.json())
    .catch(err => console.log(err)))
    .map(e => e.imdbRating)
    .subscribe(x => {
        console.log(x);
        return x;
    }, e => console.error(e));
}

但是这个函数返回一个promise对象而不是IMDB等级。 这是我在控制台上获得的输出。

  

承诺{[[PromiseStatus]]:“待定”,[[PromiseValue]]:undefined}

     

承诺{[[PromiseStatus]]:“待定”,[[PromiseValue]]:undefined}

     

8.1

     

7.3

8.1和7.3是getDeatils()中控制台语句的值,这是我要返回的。 并且在调用movieDetails()时打印promise对象。 谁能指出我,我在这里做错了什么?

1 个答案:

答案 0 :(得分:2)

getDetails函数返回subscription,而在movieDetails中,您await进行了这些订阅。简而言之,它不起作用。

当您订阅已创建的observable时,您将获得订阅以控制其生命周期。这些订阅对可观察的值没有任何作用。

const obs = Observable.from(...) //obs is Observable
const subs = obs.subscribe((x) => console.log(x)); //subs is Subscription

// subs.unsubscribe(); //when you want to unsubscribe even source does not completes

其次,你不能直接await Observables - await关键字是Promise。在Observables中,observer是访问值的方法(subscribe中提供的函数)。如果你应该使用await,将Observables转换为toPromise并获得最新的数字 - 否则,只需在getDetail中返回observable,然后通过观察者访问值即可。