Quiero llamar a un punto final usando Axios, luego hacer algo con los datos de respuesta y una variable que se definió antes de la llamada. Sé cómo pasar datos a la devolución de llamada al crear la función que devuelve la promesa yo mismo, pero dado que Axios es un código externo y parece que no puedo encontrar ninguna opción para pasar datos adicionales en los documentos de Axios o en la configuración . ¿Hay alguna otra forma de hacer que esto funcione, además de enviar el valor como datos al servidor y hacer que el servidor responda dentro de la respuesta o usar una solución fea usando la variable global de la window ?
const animate = true; // The variable to be passed axios.get('/endpoint.json') .then(function(response, animate) { // This doesn't work... if (response.data.coordinates) { console.log(animate); // ...because this is undefined setLocation('takeoff_location', response.data.coordinates, animate); // variable and response data need to be passed to this call } });Esto crea una nueva variable animate , completamente ajena a la ya definida:
function(response, animate) Esta nueva variable "sombrea" la que está en el ámbito superior, por lo que dentro de esta función cualquier referencia para animate solo hace referencia a esta nueva variable. Lo cual no está definido porque Axios (específicamente la Promise devuelta por .get() ) no tiene motivos para pasar un segundo valor a esta devolución de llamada.
No sombrees la variable:
function(response) Luego, dentro de la función, cualquier referencia a animate hará referencia a la variable en el ámbito superior.
el .then() es una promesa y tiene acceso a cualquier variable fuera del alcance (como un cierre). Si desea encapsular la llamada API, envuelva todo en una función y los argumentos van allí.
const doRequest = function(animate) { axios.get('/endpoint.json').then(function(response) { if (response.data.coordinates) { setLocation('takeoff_location', response.data.coordinates, animate); } }); }; doRequest(250); doRequest(500); Tenga en cuenta que esto hará 2 solicitudes de animación rápidamente en sucesión. Si desea "esperar" a que el otro termine primero, debe hacer esto: (tenga en cuenta que ahora estoy devolviendo la solicitud axios de la función). Esto significa que se devuelve el objeto de promesa y ahora puede encadenar más funciones .then() en el "exterior" de la función, lo que sucederá solo cuando finalice la solicitud.
const doRequest = function(animate) { return axios.get('/endpoint.json').then(function(response) { if (response.data.coordinates) { setLocation('takeoff_location', response.data.coordinates, animate); } }); }; doRequest(250).then(function() { // this will happen when the outer API call finishes doRequest(500); });