Azure Cosmos db и функции javascript sdk - как читать документы асинхронно? - PullRequest
0 голосов
/ 05 декабря 2018

У меня есть следующий код в распознавателе apollo:

Mutation: {
    addChannel: (root, args) => {
      client.readDocument("website", {}, (x) => {
        return { id: "Test", name: "Test Channel " + args.name }
      });
    },

, где клиент - клиент документа:

var DocumentClient = require('documentdb').DocumentClient;

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

У меня проблема в том, что readDocument делает что-то асинхронно в фоновом режиме, но функция isn 'Это значит, что я не могу дождаться этого, поэтому функция немедленно проваливается, прежде чем обратный вызов сможет завершиться.После отправки возвращаемых данных (которые не определены) происходит функция обратного вызова (x) => {...} ..

Ответы [ 3 ]

0 голосов
/ 05 декабря 2018

Характер вашего кода не соответствует модели обратного вызова, которой следует readDocument, поэтому у вас нет механизма для передачи документа обратно из addChannel.

Предполагая, что вам не нужнопредварительно сделав любую предварительную обработку документа, вы можете использовать комбинацию обещаний и синтаксиса async / await, например

addChannel: (root, arg) => 
  new Promise((resolve, reject) => 
    client.readDocument("website", {}, (err, x) => 
      err ? reject(err) : resolve(x)
    )
  );
}

Затем «подождать» в документе перед выполнением другого кода

const doc = await obj.addChannel(...);
// use doc

Примечание - await может использоваться только в функции, помеченной как async

0 голосов
/ 05 декабря 2018

Три решения, о которых я могу подумать (какое будет зависеть от вашей конкретной ситуации):

  1. v2 API-интерфейса Cosmos DB имеет поддержку async / await, поэтому вы можете использовать ее вместоcallback.
  2. Оберните код обратного вызова в обещании и дождитесь обещания.
  3. Используйте неасинхронную функцию Azure и верните результат с context.done(result) в конце обратного вызова.
0 голосов
/ 05 декабря 2018

Я бы предложил вам перейти к версии v2 API Javascript: https://github.com/Azure/azure-cosmos-js

Таким образом, вы можете использовать свободный путь к items и использовать const { body: readDoc } = await item.read(); для чтения асинхронных элементов.

Вы можете найти несколько примеров того, как это делается здесь

...