【问题标题】:Wait for functions to finish then return object等待函数完成然后返回对象
【发布时间】:2021-11-13 09:34:43
【问题描述】:

我想返回新更新的对象。但是当我尝试使用管道链方法分配值时,它不起作用并返回初始值。

用链式函数分配和返回对象的更好方法是什么?

代码如下:

currentUser: UserInterface = {
    accessToken: '',
    userID: '',
    name: '',
    email: '',
    picture: '',
    pageList: [],
    activePageID: 0,
    activePage: {
      name: '',
      pageID: '',
      instagramID: '',
      categoryID: '',
      tasks: [],
    },
  };

  login(user: FacebookLoginInterface) {
      this.generateLongUserToken(user.accessToken).pipe(
      map((response) => {
        this.currentUser.accessToken = response.access_token;
        this.getUserPages(this.currentUser.accessToken).pipe(
          map((response) => {
            this.currentUser.pageList = response;
            this.getInstagramBusinessAccount(
              this.currentUser.pageList[0].id,
              this.currentUser.accessToken,
            ).pipe(
              map((response) => {
                this.currentUser.activePage.instagramID =
                  response.instagram_business_account.id;
              }),
            );
          }),
        );
      }),
    ); 

    return {
      access_token: this.currentUser,
    };
  }

【问题讨论】:

  • 究竟什么是“管道链式方法”。据我所知,这不是原生 javascript/typescript 概念。
  • “管道”也不是 NextJS 的概念。至少我不知道......你打电话给this.generateLongUserToken(user.accessToken)。该方法返回什么?
  • @Elias 我正在“nestjs”中开发。当我给出一个短期令牌时,它会返回一个新的长期令牌。我想要的是:有 2-3 种方法可以从 facebook api 返回值。我需要将它们分配给“currentUser”中的对应对象。但它不会等待他们完成并立即返回“currentUser”或在方法中分配对应项不起作用。
  • 嗯,它返回的打字稿类型是什么?
  • 如果this.generateLongUserToken(user.accessToken)returns UserInterface 那接口上不应该有pipe 函数吗?

标签: typescript rxjs nestjs


【解决方案1】:

使用承诺

login() {
  return new Promise((resolve, reject) => {
      this.generateLongUserToken(user.accessToken).pipe(
      map((response) => {
        this.currentUser.accessToken = response.access_token;
        this.getUserPages(this.currentUser.accessToken).pipe(
          map((response) => {
            this.currentUser.pageList = response;
            this.getInstagramBusinessAccount(
              this.currentUser.pageList[0].id,
              this.currentUser.accessToken,
            ).pipe(
              map((response) => {
                this.currentUser.activePage.instagramID =
                  response.instagram_business_account.id;
                // If I understand correctly, at this point `currentUser`
                // is ready to be returned, so resolve the promise here
                resolve() 
              }),
            );
          }),
        );
      }),
    ); 
  }).then(() => ({
    access_token: this.currentUser,
  }))
}

currentUser.login().then(user => {
  // Here user is updated
})

您也可以稍微清理一下以减少嵌套级别

login() {
  return new Promise((resolve) => {
    this.generateLongUserToken(user.accessToken).pipe(
      map((response) => {
        this.currentUser.accessToken = response.access_token;
        resolve(response.access_token)
      })
    )
  }).then((accessToken) => new Promise((resolve) => {
    this.getUserPages(this.currentUser.accessToken).pipe(
      map((response) => {
        this.currentUser.pageList = response;
        resolve({pageList: response, accessToken})
      })
    )
  })).then(({pageList, accessToken}) => new Promise(resolve => {
      this.getInstagramBusinessAccount(
        this.currentUser.pageList[0].id,
        this.currentUser.accessToken,
      ).pipe(
        map((response) => {
          this.currentUser.activePage.instagramID =
              response.instagram_business_account.id;
          resolve()
        })
      )
  })).then(() => ({
    access_token: this.currentUser,
  }))
}

除非这仅在map 中的函数将被调用一次时才有效。 map 这个名字表明回调可能会被多次调用,在这种情况下这不会起作用。无论如何,你应该使用承诺

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-08-01
    • 1970-01-01
    • 2016-09-15
    • 1970-01-01
    • 2019-05-14
    • 2021-09-29
    • 2012-06-02
    相关资源
    最近更新 更多