Как создать массив обещаний в распознавателе GraphQL с несколькими вызовами API для возврата одного списка типов объектов - PullRequest
0 голосов
/ 20 сентября 2018

Я застрял в своем распознавателе GraphQL, выбирая списки задач для конкретного пользователя, принадлежащего компании.В зависимости от того, имеют ли они доступ ко всем спискам задач или к некоторым из них, он будет выбирать группы, в которых зарегистрированный пользователь имеет принадлежащие списки задач, и они должны быть выбраны.

Код на данный моментспособен регистрировать запрошенные списки задач по запросу, но мне еще не пришло решение о том, как на самом деле возвращать данные всех списков задач зарегистрированных групп пользователей.

Я решил экспортировать фактическиелогика в отдельную функцию

Resolver:

allowedListItems: {
  type: new GraphQLList(TodoItem),
  resolve(parentValue, args) {
    return Promise.all([fetchAllowedItems(parentValue._id)]);
  }
},

Функция Promise

function fetchAllowedItems(userId) {
  return User.findOne({ _id: userId }).then((user) => {
    if (user.todoGroups) {
      return user.todoGroups.map((groupId) => {
        return TodoGroup.findOne({ _id: groupId }).then(group => {
          return group.todoLists.map((listId) => {
            return TodoList.findOne({ _id: listId })
          })
        })
      })
    } else {
      return TodoList.find({ company: parentValue.company }).exec();
    }
  })
}

Я не получаю никаких ошибок от GraphQL, поэтому я думаю, что это о том, какЯ делаю обещания, возвращаюсь к распознавателю, я был бы очень признателен, если бы вы мне помогли!

Обновление:

Я должен обернуть карты в Promise.all, как отображениевозвращает массив.Хотя обновленный код не приводит к улучшению возвращаемых данных.

async resolve(parentValue, args) {
    let user = await User.findOne({ _id: parentValue._id })

    if (user.todoGroups) {
      return Promise.all(user.todoGroups.map((groupId) => {
        return TodoGroup.findOne({ _id: groupId }).then(group => {
          return Promise.all(group.todoLists.map((listId) => {
            return TodoList.findOne({ _id: listId });
          }))
        })
      }))
    } else {
      return TodoList.find({ company: parentValue.company }).exec();
    }
  }
},

Текущий результат запроса:

{
  "data": {
    "user": {
      "_id": "5ba11690ad7a93d2b34d21a9",
      "allowedTodos": [
        {
          "_id": null,
          "title": null
        }
      ]
    }
  }
}

1 Ответ

0 голосов
/ 20 сентября 2018

Вам нужно вызвать Promise.all для массива обещаний, а не обещаний для этого.Также вам придется вызывать его на каждом уровне:

allowedListItems: {
  type: new GraphQLList(TodoItem),
  resolve(parentValue, args) {
    return User.findOne({ _id: parentValue._id }).then(user => {
      if (user.todoGroups) {
        return Promise.all(user.todoGroups.map(groupId => {
//             ^^^^^^^^^^^^
          return TodoGroup.findOne({ _id: groupId }).then(group => {
            return Promise.all(group.todoLists.map(listId => {
//                 ^^^^^^^^^^^^
              return TodoList.findOne({ _id: listId })
            }));
          });
        }));
      } else {
        return TodoList.find({ company: parentValue.company }).exec();
      }
    });
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...