异步函数不返回值,但是控制台日志()做:如何做?

异步函数不返回值,但是控制台日志()做:如何做?

我有ES6课程init()方法负责获取、转换数据,然后更新类的属性this.data新转换的数据。到目前一切尚好。这个类本身有另一个getPostById()方法,只做听起来像的事。下面是这个类的代码:

class Posts {
  constructor(url) {
    this.ready = false
    this.data = {}
    this.url = url  }
  async init() {
      try { 
        let res = await fetch( this.url )
        if (res.ok) {
            let data = await res.json()

          // Do bunch of transformation stuff here

          this.data = data          this.ready = true
            return data        }
      } 
      catch (e) { 
         console.log(e)
      }
  }
  getPostById(id){
     return this.data.find( p => p.id === id )
  }}

直截了当,除了我有一个async/await机制init()方法。现在,此代码将正确工作:

let allPosts = new Posts('https://jsonplaceholder.typicode.com/posts')allPosts.init()
        .then( d => console.log(allPosts.getPostById(4)) )// resulting Object correctly logged in console

但是它只会被打印到控制台上:我如何使用allPosts.getPostById(4)作为return某项功能?

比如:

let myFunc = async () => {
   const postId = 4
   await allPosts.init()  // I need to wait for this to finish before returning

   // This is logging correct value
   console.log( 'logging: ' + JSON.stringify(allPosts.getPostById( postId ), null, 4) )

   // How can I return the RESULT of allPosts.getPostById( postId ) ???
   return allPosts.getPostById( postId )}

myFunc()返回Promise但不是最终价值。我读过几篇关于这一主题的相关文章,但它们都给出了日志记录的例子,再也没有回来过。

这是一把小提琴这包括两种处理方法init()*使用Promise和使用async/await..无论我尝试什么,我都无法使用getPostById(id).

这个职位的问题是:如何创建一个函数,该函数将返回getPostById(id) ?

编辑:

许多好的答案试图解释什么是承诺的主要执行循环。经过大量的视频和其他很好的阅读之后,下面是我现在所理解的:

我的职能init()正确返回。但是,在主事件循环中:它返回承诺,那么我的工作就是从有点并行循环(不是一个新的真正线程)。为了捕获并行循环的结果,有两种方法:

  1. 使用.then( value => doSomethingWithMy(value) )

  2. 使用let value = await myAsyncFn()..现在是愚蠢的打嗝:

等待只能在async职能:P

因此,它本身就返回了一个承诺,可以用在await应该嵌入到async函数,该函数可用于await等等.。

这意味着我们不能真正等待承诺:相反,我们应该无限期地捕获并行循环:.then()async/await.

谢谢你的帮助!


BIG阳
浏览 195回答 3
3回答
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript