等待函数完成然后 return 对象

Wait for functions to finish then return object

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

用链式函数和 return 对象赋值的更好方法是什么?

代码如下:

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,
    };
  }

使用承诺

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 表明回调可能会被多次调用,在这种情况下这将不起作用。无论如何,你应该使用 promises