我编写了一个函数,该函数将通过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]]:未定义}
承诺{[[[PromiseStatus]]:“待定”,[[PromiseValue]]:未定义}
8.1
7.3
8.1和7.3是getDeatils()中控制台语句的值,这是我要返回的内容。
并且在调用movieDetails()时将打印promise对象。
有人可以指出我,我在这里做错了吗?
最佳答案
getDetails
函数返回subscription
,并且在movieDetails
中您正在await
那些订阅。简而言之,它不起作用。
订阅创建的可观察对象时,您将获得订阅以控制其生命周期。这些订阅对可观察值没有任何作用。
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中,观察者是访问值的方式(subscribe
中提供的功能)。如果您应该使用await,请将Observables转换为toPromise
并仅获取最新数字-否则,只需在getDetail
中返回observable即可,然后可以通过观察者访问值。关于javascript - 可观的 promise 迫不及待地实现,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47754303/