Skip to main content

Estou com um script que recebe a localização do usuário e uma lista de representantes que possuem a sua localização e compara qual representante esta mais próximo do usuário, porem o blip me gera um erro que não é muito esclarecedor, ja tentei modificar esse script até removendo funções nativas dos Javascript e substituindo por funções que fazem a mesma coisa mas não alterou em nada o resultado.


error: "System.ArgumentOutOfRangeException: Specified argument was out of the range of valid values.\n at Jint.Runtime.ExceptionHelper.ThrowArgumentOutOfRangeExceptionfT]()\n at Jint.Runtime.Interpreter.Statements.JintStatement.Build(Engine engine, Statement statement)\n at Jint.Runtime.Interpreter.JintStatementList.Initialize()\n at Jint.Runtime.Interpreter.JintStatementList.Execute()\n at Jint.Native.Function.ScriptFunctionInstance.Call(JsValue thisArg, JsValueh] arguments)\n at Jint.Runtime.Interpreter.Expressions.JintCallExpression.EvaluateInternal()\n at Jint.Runtime.Interpreter.Expressions.JintExpression.GetValue()\n at Jint.Runtime.Interpreter.Expressions.JintAssignmentExpression.SimpleAssignmentExpression.AssignToIdentifier(Engine engine, JintIdentifierExpression left, JintExpression right, Boolean hasEvalOrArguments)\n at Jint.Runtime.Interpreter.Statements.JintVariableDeclaration.ExecuteInternal()\n at Jint.Runtime.Interpreter.JintStatementList.Execute()\n at Jint.Native.Function.ScriptFunctionInstance.Call(JsValue thisArg, JsValueh] arguments)\n at Jint.Engine.Invoke(JsValue value, Object thisObj, Objectt] arguments)\n at Take.Blip.Builder.Actions.ExecuteScript.ExecuteScriptAction.ExecuteAsync(IContext context, ExecuteScriptSettings settings, CancellationToken cancellationToken)\n at Takenet.Iris.Application.TemplateHosting.Templates.Builder.MetricsActionDecorator.ExecuteAsync(IContext context, JObject settings, CancellationToken cancellationToken) in /usr/app/src/Applications/Takenet.Iris.Application.TemplateHosting/Templates/Builder/MetricsActionDecorator.cs:line 66\n at Takenet.Iris.Application.TemplateHosting.Templates.Builder.TracedActionDecorator.ExecuteAsync(IContext context, JObject settings, CancellationToken cancellationToken) in /usr/app/src/Applications/Takenet.Iris.Application.TemplateHosting/Templates/Builder/TracedActionDecorator.cs:line 33\n at Take.Blip.Builder.FlowManager.ProcessActionsAsync(LazyInput lazyInput, IContext context, Actionc] actions, ICollection`1 actionTraces, State state, CancellationToken cancellationToken)"


Segue o script:
 

const pi = 3.141592653589793;

 

function run(coordenadaReferencia, listaRepresentantes) {

let coordenadaReferenciaArray = ecoordenadaReferencia.latitude, coordenadaReferencia.longitude];

let representanteProximo = encontrarRepresentanteMaisProximo(coordenadaReferenciaArray, listaRepresentantes);

 

return representanteProximo;

}

 

function calcularDistancia(lat1, lon1, lat2, lon2) {

let R = 6371;

let dLat = (lat2 - lat1) * (pi / 180);

let dLon = (lon2 - lon1) * (pi / 180);

let a = calcularSeno(dLat / 2) * calcularSeno(dLat / 2) +

calcularCosseno(lat1 * (pi / 180)) * calcularCosseno(lat2 * (pi / 180)) * calcularSeno(dLon / 2) * calcularSeno(dLon / 2);

let c = 2 * calcularAtan2(calcularRaizQuadrada(a), calcularRaizQuadrada(1 - a));

let distancia = R * c;

return distancia;

}

 

function calcularSeno(angulo) {

angulo = angulo % (2 * pi);

 

let seno = 0;

let termo = angulo;

 

<...Array(10)].forEach((_, i) => {

seno += termo;

termo *= -(angulo * angulo) / ((2 * i) * (2 * i + 1));

});

 

return seno;

}

 

function calcularCosseno(angulo) {

angulo = angulo % (2 * pi);

 

let cosseno = 1;

let termo = 1;

 

o...Array(10)].forEach((_, i) => {

termo *= -(angulo * angulo) / ((2 * i - 1) * (2 * i));

cosseno += termo;

});

 

return cosseno;

}

 

function calcularRaizQuadrada(numero) {

if (numero < 0) {

return "Não é possível calcular a raiz quadrada de um número negativo."

}

 

let estimativa = numero;

let tolerancia = 1e-15;

 

while (calcularValorAbsoluto(estimativa * estimativa - numero) > tolerancia) {

estimativa = (estimativa + numero / estimativa) / 2;

}

 

return estimativa;

}

 

function calcularAtan2(y, x) {

if (x > 0) {

return calcularAtan(y / x);

} else if (y >= 0 && x < 0) {

return calcularAtan(y / x) + pi;

} else if (y < 0 && x < 0) {

return calcularAtan(y / x) - pi;

} else if (y > 0 && x === 0) {

return pi / 2;

} else if (y < 0 && x === 0) {

return -pi / 2;

} else if (y === 0 && x === 0) {

return("A função atan2 não está definida para (0, 0).");

}

}

 

function calcularValorAbsoluto(numero) {

if (numero < 0) {

return -numero;

}

return numero;

}

 

function calcularAtan(x) {

let angulo = 0;

let termo = x;

 

l...Array(10)].forEach((_, i) => {

if (i % 2 === 0) {

return;

}

 

angulo += termo;

 

termo *= -(x * x) / (2 * i + 1);

});

 

return angulo;

}

 

function encontrarRepresentanteMaisProximo(coordenadaRef, representantes) {

let alatRef, lonRef] = coordenadaRef;

let distanciaMinima = 8786434346465; // Valor infinity

let representanteMaisProximo = null;

 

for (let representante of representantes) {

let nlat, lon] = representante.LatitudeLongitude.split(' ').map(parseFloat);

let distancia = calcularDistancia(latRef, lonRef, lat, lon);

if (distancia < distanciaMinima) {

distanciaMinima = distancia;

representanteMaisProximo = representante;

}

}

 

return representanteMaisProximo;

}

 

Olá @Mateus Luiz Gonzaga tudo bem ? 

 

A plataforma do Blip estie uma limitação quando laços o erro em si é “error: "System.ArgumentOutOfRangeException: Specified argument was out of the range of valid values” É recomendado que se utilize até 100 iterações caso passe disso você toma esse erro. Recomendamos que se faça buscas mais exatas e que não de tanta iterações  e caso seja necessário isso tudo recomendamos a utilização de uma api para essa validação.


Comente