【问题标题】:How to filter Subscription events based on some object's id?如何根据某个对象的 id 过滤订阅事件?
【发布时间】:2021-09-25 13:35:04
【问题描述】:

我希望能够根据对象 ID 过滤某些操作的订阅。例如我想做这样的事情:

subscription{
  onTaskCompleted(taskId: "1"){
    taskCompleted{
      status
      items{
        reason
        iD
      }
    }
    taskFailed{
      status
      details{
        detail
        status        
      }
    }
  }
}

只有在 ID 为“1”的任务完成时才会发出事件。

有没有一种内置的方法可以通过HotChocolate 使用某种类型的过滤来做到这一点?

我是否必须自己添加这种类型的过滤,通过在解析器中执行类似的操作:

if(_taskIds.Contains(taskId))
{
   TaskCompletedExecution taskFinished = new TaskCompletedExecution(taskCompleted);
   await eventSender.SendAsync(nameof(TaskListSubscriptions.OnTaskCompleted), taskFinished, 
   cancellationToken);
}

谢谢

【问题讨论】:

    标签: graphql graphql-subscriptions hotchocolate


    【解决方案1】:

    你可以这样做:

            [SubscribeAndResolve]
            public async IAsyncEnumerable<TaskCompletedExecution> OnTaskCompletedAsync(
                string taskId,
                [Service] ITopicEventReceiver eventReceiver,
                CancellationToken cancellationToken)
            {           
                var stream = await eventReceiver.SubscribeAsync<string, TaskCompletedExecution>(
                    $"on-task-completed-{taskId}", cancellationToken);
                
                await foreach (var data in stream.ReadEventsAsync().WithCancellation(cancellationToken))
                {
                    yield return data;
                }
            }
    

    要触发它,您可以将它们发布到on-task-completed-123,然后才会将其发送给提供123 作为taskId 的订阅者。

    【讨论】:

      猜你喜欢
      • 2017-08-09
      • 1970-01-01
      • 2022-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-23
      • 1970-01-01
      • 2017-11-22
      相关资源
      最近更新 更多