2016-11-04 77 views
2

我基本上試圖調用AJAX成功響應內部的AJAX之外的函數。在AJAX成功響應中調用函數?

爲了更好地解釋這一點,這就是我所擁有的。

這是兩個功能:

function watchCurrentPosition() { 
    var positionTimer = navigator.geolocation.watchPosition(function(position) { 
     setMarkerPosition(userLocation, position); 
     map.panTo(new google.maps.LatLng(position.coords.latitude, position.coords.longitude)); 

    }); 

} 

function clearmyWatch() { 

    navigator.geolocation.clearWatch(positionTimer); 
} 

其中一人會一直監視用戶的位置,而另一個「應該」停止它。

這是我如何調用AJAX內部clearmyWatch();功能:

$.ajax({ 
     type:"post", 
     url:"TEST.PHP", 
     datatype:"html", 
     success:function(data) 
     { 
clearmyWatch(); 
     } 
    }); 

但是,這並不工作和watchCurrentPosition();不斷磨合和我在控制檯還得到一個錯誤。

,我得到的錯誤是這樣的:

ReferenceError: positionTimer is not defined 

可能有人請告知這個問題?

在此先感謝。

+2

定義在全球範圍內''positionTimer – Satpal

+0

positionTimer是局部變量嘗試宣告它在全球 –

+0

或者更好的是把所有進入封閉這讓你不polute全球範圍內 – Liam

回答

3

您需要在全球層面來定義positionTimerfunction watchCurrentPosition()外,如:

var positionTimer = null; 

function watchCurrentPosition() { 
    positionTimer = navigator.geolocation.watchPosition(function(position) { 
     setMarkerPosition(userLocation, position); 
     map.panTo(new google.maps.LatLng(position.coords.latitude, position.coords.longitude)); 

    }); 

} 

function clearmyWatch() { 
    if(positionTimer) 
     navigator.geolocation.clearWatch(positionTimer); 
} 
+0

一般而言,應避免全局水平變量。我這種情況下,它可以優雅地解決沒有一個全局變量。 –

+0

@O_Z謝謝。我會記下它的。 – vijayP

+0

爲什麼應該避免全局變量? – Jackson

0

positionTimer是本地watchCurrentPosition

更好的方法來解決它沒有全局變量是:

function watchCurrentPosition() { 
    var positionTimer = navigator.geolocation.watchPosition(function(position) { 
     setMarkerPosition(userLocation, position); 
     map.panTo(new google.maps.LatLng(position.coords.latitude, position.coords.longitude)); 

    }); 

    clearmyWatch=()=>{ 
    navigator.geolocation.clearWatch(positionTimer); 
    } 

} 

function clearmyWatch() {} 

Explenation:clearmyWatch的定義方式是什麼都不做。但調用watchCurrentPositionclearmyWatch設置爲watchCurrentPosition的內部函數可以得到positionTimer。實際上,通過將clearmyWatch設置爲watchCurrentPosition的內部函數,我們創建了一個閉包(瞭解它的內容不知道它是什麼,這很重要)。