Criei um SPA com angular e resolvi o problema do tamanho da mensagem no signalR, mas antes de aumentar e mover o problema para mais tarde, eu queria dividir a mensagem com um fluxo.
é bem simples:
const subject = new Subject<any>();
try
{
await this.hubConn.send("Values", id, subject) // X
.catch(err => console.error(err));
for (let i = 0; i < values.length; ++i)
subject.next(values[i]);
subject.complete();
}
catch (err: any)
{
subject.error('Error');
console.error(err.message);
}
Mas recebo um erro na linha marcada com // X
depois de alguma investigação descobri que na segunda iteração streamId
é distinct
:
Vou construir um pequeno exemplo para verificar o que acontece:
var streams = [];
streams[4] = {};
for (const streamId in streams)
console.debug(streamId);
o que me dá este resultado:
4
distinct
equals
firstOrDefault
lastOrDefault
pushSorted
mas isso significa que iterar sobre as chaves sempre itera sobre as funções do array, mas não encontrei nada sobre esse problema...
Estou usando:
angular 16.2
typescript 5.1.6
signalR 7.0.9 and 8.0.7 (tried both)
nodejs 16.20.2
and I have the target ES2022
então, ou ninguém nunca tentou fazer streaming (o que parece muito improvável), ou tenho uma incompatibilidade de versão ou tenho algum erro no meu código que não consigo ver...
Alguém tem alguma ideia de por que isso pode não funcionar?
// Editar: Aqui está o método do lado do servidor para receber os valores:
[HubMethodName(nameof(Values))]
public async Task Values(string id, IAsyncEnumerable<object> values)
{
try
{
object[] result = null;
if (values != null)
result = await values.ToArrayAsync();
Debug.WriteLine(result);
}
catch (Exception ex)
{
SystemLogger.LogCritical("{ex}", ex);
}
}
É muito provável que você esteja usando uma biblioteca que modifica
Array.prototype
de forma errada:A maneira correta é usar
Object.defineProperty
(ou melhor ainda, não alterar os protótipos principais). Nesse caso, a propriedade não se tornaria enumerável.