我编写了一个函数,该函数将通过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/

10-09 16:41