我编写了一个函数,它将通过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对象。 谁能指出我,我在这里做错了什么?
答案 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,然后通过观察者访问值即可。