javascript - Kan inte skicka en funktion som parameter från en NextJS-komponent


Jag har den här typen av kod i en NextJS-komponent:

    const [currentGPS, setCurrentGPS] =
            useState({coords:{latitude:0.0,longitude:0.0}})

    useEffect(() => {
      utl.getGPSLocation(
        (v:{coords: {latitude:number; longitude:number;};})=>
        setCurrentGPS(v))
    }, [])

När du använder funktionen nedan:

    function getGPSLocation({callBackFn}:
      {callBackFn:
        (v:{coords: {latitude:number; longitude:number;};}) => void
      }) {
      if (navigator.geolocation) {
        navigator.geolocation.getCurrentPosition(
          (position: {coords: {latitude:number; longitude:number;};}) => {
            callBackFn(position)
            console.log('(U)position.coords.latitude='+JSON.stringify(position.coords.latitude))
            console.log('(U)position.coords.longitude='+JSON.stringify(position.coords.longitude))
          });
      } else {
        console.log("Geolocation is not supported by this browser.");
      }
    } /* End of getGPSLocation */

Jag får detta fel i konsolen för Webb utvecklarverktyg i min webbläsare:

Okänt TypeError: t är inte en funktion
NextJS 10
page-1aeb39b39d44f814.js:1:332

Meddelandet ovan beror på kodraden:

    callBackFn(position)

Om jag kommenterar ut raden ser jag det jag förväntar mig:

(U)position.coords.latitude=25.515932844138406 page-2bc533c4f68ab71b.js:1:339
(U)position.coords.longitude=67.32855152591916 page-2bc533c4f68ab71b.js:1:417

Varför får jag felet? Och vad är sättet att lösa det?

Jag behöver hjälp med att skicka setCurrentGPS (som en callback) till getGPSLocation.

Svar #1

getGPSLocation förväntar sig ett objekt med nyckeln callBackFn som argument. Du kan uppdatera ditt useEffect enligt följande

useEffect(() => {
  utl.getGPSLocation({
    callBackFn: (v: { coords: { latitude: number; longitude: number } }) =>
      setCurrentGPS(v)
  });
}, []);

Eller, du kan ändra funktionsdefinitionen

function getGPSLocation(
  callBackFn: (v: { coords: { latitude: number; longitude: number } }) => void
) {
  if (navigator.geolocation) {
    navigator.geolocation.getCurrentPosition(
      (position: { coords: { latitude: number; longitude: number } }) => {
        callBackFn(position);
        console.log('(U)position.coords.latitude=' + JSON.stringify(position.coords.latitude));
        console.log('(U)position.coords.longitude=' + JSON.stringify(position.coords.longitude));
      });
  } else {
    console.log("Geolocation is not supported by this browser.");
  }
}