【问题标题】:Returning data out from promise then chain从承诺中返回数据然后链
【发布时间】:2020-01-08 13:56:42
【问题描述】:

我有一个类方法(对于'apollo-datasource-rest',它应该从plan_id 获取plan。我需要点击两个端点并合并数据。这适用于Promise.all([promise1, promise2]),然后传递@ 987654325@ 转到下一个多次调用GET /users 端点的Promise.all 方法。如果我console.log 退出返回的usersArray,我会得到用户数组,但如果我尝试返回该数组,它没有分配给objToReturn 变量。我还需要将snapshot2 中的数据添加到objToReturn,但这是次要的。

  getPlanById = async ( planId ) => {
    const promise1 = new Promise((resolve) => {
      return resolve(this.get('/url1'))
    });
    const promise2 = new Promise((resolve) => {
      return resolve(this.get('/url2'))
    });    

    const objToReturn = await Promise.all([promise1, promise2])
      .then(([snapshot1, snapshot2]) => {
        return snapshot1.user_ids
      })
      .then((userIds) => {
        this.getUsersFromUserIds(userIds).then((usersArray) => {
          console.log(usersArray)
          // return usersArray doesn't assign to objToReturn
        })
      })
    return objToReturn
  }

  getUsersFromUserIds(userIds) {
    let userPromises = []
    userIds.forEach((uid) => {
      const promise = this.get(`/users/${uid}`)
      .then((response) => {
        if (response.status === 'success') {
          return response.data.user
        } else {
          return null
        }
      })
      userPromises.push(promise)
    })
    return Promise.all(userPromises).
      then((userPromiseData) => {
        return userPromiseData
      })
  }

【问题讨论】:

  • 你不会在最后一次回来。 return this.getUsersFromUserIds... 需要等待objecttToReturn
  • 旁注:this.get() 已经返回了一个promise,所以这里的一堆代码是多余的。

标签: javascript es6-promise apollo-server


【解决方案1】:

你需要返回this.getUsersFromUserIds(userIds)的承诺。这样promise链就可以工作了。

例如

index.js:

class UserAPI {
  async getPlanById(planId) {
    const promise1 = Promise.resolve({ user_ids: [1, 2] });
    const promise2 = Promise.resolve();

    const objToReturn = await Promise.all([promise1, promise2])
      .then(([snapshot1, snapshot2]) => {
        return snapshot1.user_ids;
      })
      .then((userIds) => {
        // You need to return here
        return this.getUsersFromUserIds(userIds).then((usersArray) => {
          return usersArray;
        });
      });
    return objToReturn;
  }

  async getUsersFromUserIds(userIds) {
    return [
      { id: 1, name: 'a' },
      { id: 2, name: 'b' },
    ];
  }
}

const userAPI = new UserAPI();
userAPI.getPlanById(1).then((objToReturn) => {
  console.log('objToReturn: ', objToReturn);
});

控制台中的输出:

objToReturn:  [ { id: 1, name: 'a' }, { id: 2, name: 'b' } ]

【讨论】:

    猜你喜欢
    • 2015-03-14
    • 2019-07-23
    • 2023-01-27
    • 1970-01-01
    • 2015-04-15
    • 2017-11-27
    • 1970-01-01
    • 2018-12-06
    • 1970-01-01
    相关资源
    最近更新 更多