Estoy tratando de convertir este código en promesa (el que comenté //). Mi objetivo es imprimir la ubicación del usuario (longitud y latitud), pero me está costando mucho averiguar cómo convertir esto en Promise. (Lo siento por mi ingles)
// const getUserLocation = () => { // if (navigator.geolocation) { // navigator.geolocation.getCurrentPosition(succes, error); // } else { // console.log('Your browser does not support geolocation'); // } // } // const succes = (positon) => { // console.log(positon.coords.latitude) // console.log(positon.coords.longitude) // } // const error = (err) => { // console.log('The User have denied the request for Geolocation.'); // } // getUserLocation(); const getUserLocation = () => { return new Promise((resolve, reject) => { if (navigator.geolocation) { resolve(navigator.geolocation.getCurrentPosition); } else { reject('The User have denied the request for Geolocation.'); } }) } getUserLocation() .then((response) => { console.log(response.coords.longitude); console.log(response.coords.latitude); }) .catch((err) => { console.log(err); })Estás muy cerca, la variante de promesa debería verse así:
const getUserLocation = () => { return new Promise((resolve, reject) => { if (navigator.geolocation) { navigator.geolocation.getCurrentPosition(resolve, reject); } else { reject('The User have denied the request for Geolocation.'); } }) } En el código anterior, pasa las funciones de resolve y reject a getCurrentPosition() , que las llama con la posición de geolocalización o un error (en el caso de reject ) como único argumento.
Simplemente pasaría resolve y reject de la función Promise a la función getCurrentPosition .
const getUserLocation = () => { return new Promise((resolve, reject) => { if (navigator.geolocation) { navigator.geolocation.getCurrentPosition(resolve, reject) } else { reject('The User have denied the request for Geolocation.'); } }) } getUserLocation() .then((response) => { console.log('success:', response.coords.longitude, response.coords.latitude); }) .catch((err) => { console.log('error:', err); })No. Esa no es la forma de hacerlo. No hay nada especial en las promesas. No es una nueva sintaxis añadida al lenguaje. Es solo un constructor/clase ordinario que puede escribir usted mismo en javascript puro. Por lo tanto, no hay nada especial que resolve() pueda hacer para convertir las devoluciones de llamada en promesas.
La forma correcta es pasar el value pasado a la devolución de llamada a la función resolve() :
// To avoid confusion I rename the resolve() and reject() function to // AAA and BBB. This is to illustrate that they are just variables // **you** declare and do not have any special syntax. This is also // to avoid confusion with the Promise.resolve() static method. const getUserLocation = () => { return new Promise((AAA, BBB) => { if (navigator.geolocation) { navigator.geolocation.getCurrentPosition(succes, error); } else { console.log('Your browser does not support geolocation'); BBB(new Error('Your browser does not support geolocation')); // optional } const succes = (positon) => { console.log(positon.coords.latitude) console.log(positon.coords.longitude) AAA(position); // This is how you correctly resolve() } const error = (err) => { console.log('The User have denied the request for Geolocation.'); BBB(err); // This is how you correctly reject() } }); } Básicamente, debe copiar sus funciones de éxito () y error () en el alcance de su función getUserLocation() y luego DEBE resolver o rechazar dentro de esas funciones.