Результат доступа к PubNub в асинхронном методе

Я пишу API, который предоставит доступ к каналу pubnub, но мне нужно дождаться предоставления доступа и вернуть результат. Может кто-нибудь подсказать, как я могу дождаться ответа, пожалуйста?

The return type of .Async is void

Метод, который я вызываю для предоставления доступа, выглядит следующим образом:

pubnub.Grant()
            .Channels(new string[] {
            "channel"
            })
            .Read(true)
            .Write(true)
            .AuthKeys(new List<string>() { "xyz" }.ToArray())
            .TTL(0)
            .Async(new PNAccessManagerGrantResultExt((result, status) =>
            {
               //I need to await this and return the result in my method
            }));

Since it does not return a task I cannot await it and my return statement would execute before this even completes.

Любые советы будут высоко ценится.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
0
215
1

Ответы 1

Мне прислали следующее решение от службы поддержки PubNub, которое решает эту проблему, см. ниже

var resultTask = new TaskCompletionSource<PNAccessManagerGrantResult>();

pubnub.Grant()
            .Channels(new string[] {
            "channel"
            })
            .Read(true)
            .Write(true)
            .AuthKeys(new List<string>() { "xyz" }.ToArray())
            .TTL(0)
            .Async(new PNAccessManagerGrantResultExt((result, status) =>
            {
               resultTask.TrySetResult(result);
            }));

var syncResult = resultTask.Task.Result;
var syncResult = resultTask.Task.Result; Эта строка сводит на нет все преимущества использования метода async. Узнайте, почему здесь: msdn.microsoft.com/en-us/magazine/jj991977.aspx — особенно раздел под названием Асинхронно на всем пути.
Steve Land 18.03.2019 17:06

Но вы ничего не можете сделать, пока не будет предоставлен грант, поэтому вы не можете сделать это асинхронно. Но мой вопрос будет таким: «Вы предоставляете разрешения своему серверу или клиентскому приложению?» Дайте мне знать, потому что у меня есть разные советы, соответственно.

Craig Conover 18.03.2019 17:35

@CraigConover Точно, мне нужно знать результат. Я предоставляю клиентскому приложению короткий TTL.

David Hawkins 20.03.2019 18:10

Вы должны быть в состоянии выполнить асинхронный грант, и к тому времени, когда клиентское приложение получит ключ авторизации, он должен быть правильно распространен во всех наших точках присутствия, но есть вероятность, что он будет 403 по запросу от клиента из-за этого не полностью распространяется до того, как будет сделан этот запрос. Хорошей новостью является то, что у нас есть новая версия auth (Access Manager), которая на данный момент не является GA, и в ней нет этой проблемы. (продолжение в следующем комментарии)

Craig Conover 20.03.2019 22:30

Обходной путь — приостановить 1 с на стороне клиента перед выполнением запроса. Это нежелательный обходной путь, но лучше, чем повторная попытка 403 от клиента, потому что 403 будет кэшироваться в течение 5 секунд. У меня будет технический обзор, если есть варианты получше. Но auth v3 здесь является окончательным решением.

Craig Conover 20.03.2019 22:31

Другие вопросы по теме