Estoy usando SignalR. Quiero enviar una solicitud de actualización por websocket para cada elemento en foreach para actualizar el temporizador. Pero recibo un error. Tal vez la conexión no pueda establecerse a tiempo para crear la conexión. ¿Necesito usar la función await ti start ()?
Mi contexto de SignalR es: main.js
"use strict"; var connection = new signalR.HubConnectionBuilder().withUrl("/main").build(); async function start() { try { await connection.start(); } catch (err) { console.log(err); } }; async function ItemStatusRequest(id) { connection.invoke("ItemStatusRequest", id).catch(function (err) { return console.error(err.toString()); }); }mi codigo html:
@model IEnumerable<AuctionWebApp.Models.AuctionItemViewModel> @{ ViewData["Title"] = "Index"; } <script src="~/js/signalr/dist/browser/signalr.min.js"></script> <script src="~/js/main.js"></script> <script type="text/javascript"> await start(); </script> <table class="table"> <thead> ... </thead> <tbody> @foreach (var item in Model) { <tr> <td> <p id=@item.Id value=@item.Id>@(item.Id)</p> </td> <td> @Html.DisplayFor(modelItem => item.Name) </td> <td> @*timer*@ <div id=clock@(item.Id) class="countdown"> <span class="hours countdown-time"></span> <span class="countdown-text">:</span> <span class="minutes countdown-time"></span> <span class="countdown-text">:</span> <span class="seconds countdown-time"></span> <span class="countdown-text"></span> </div> <script defer type="text/javascript"> ItemStatusRequest(@(item.Id)) </script> </td> <td> @Html.DisplayFor(modelItem => item.CurrentPrice) </td> <td> @item.StartTime.ToLocalTime(); </td> <td> status </td> </tr>} </tbody> </table>Resolví este problema llamando a la función de inicio en la carga de la página.
conexión.inicio(). entonces (función ()
Mi llamada funcional después de que la conexión haya comenzado usando js .then
Al final de html:
<script> start(@Json.Serialize(Model.Select(x => x.Id.ToString()).ToArray())); </script>En SignalR-side me manejo así:
function start(arrId) { connection.start().then(function () { arrId.forEach(id => connection.invoke("ItemStatusRequest", id).catch(function (err) { return console.error(err.toString()); })) event.preventDefault(); }).catch(function (err) { return console.error(err.toString()); });};