2014-03-28 75 views
1

我有以下代碼:的JavaScript:異步情況下

var IPMapper = { 
    markerArray = []; 
    addIPArray: function(ipArray) { 
     ..... 
     for (var i = 0; i < ipArray.length; i++) { 
      IPMapper.addIPMarker(ipArray[i], i, ipArray.length, IPMapper.f_callback); 
     } 
     return IPMapper.markerArray; 
    }, 
    addIPMarker: function(ip, i, ip_array_length) { 
     var url = encodeURI(IPMapper.baseUrl + ip + "?callback=?"); 
     $.getJSON(url, function(data) { 
      var latitude = data.latitude; 
      var longitude = data.longitude; 
      var latlng = new google.maps.LatLng(latitude, longitude); 
      var marker = new google.maps.Marker({ 
       draggable: false, 
       position: latlng 
      }); 
      IPMapper.markerArray.push(marker); 
     } 
    } 
} 

我曾嘗試:

IPMapper.addIPArray(array_with_ips); 

,但我得到一個空數組。我如何返回一個填充數組?我需要致電IPMapper.addIPArray返回結果。我試着回撥IPMapper.addIPMarker,但這不是我所需要的(我只需要調用一個函數並獲得結果(在RoR中進行下一次緩存的情況))。請對此有任何意見。

+0

請參閱http://stackoverflow.com/questions/14220321/how-to-return-the-response-from-an-ajax-call和http://stackoverflow.com/q/8726046/218196 –

回答

1

一(壞的)選擇是使用的$.ajax代替$.getJSON,在那裏你可以設置async=false,但async=false已被廢棄,因此強烈反對。

一個更好的選擇是使用.done()一個回調函數分配值。然後,而不是從addIPArray返回IPMapper.markerArray,你可以公開爲您IPMapper對象的屬性,後來抓住它。然後考慮在ajax調用完成時發出事件表明它已準備就緒,並在該事件的處理程序中訪問IPMapper.markerArray以執行您需要執行的操作。

1

,但我得到一個空數組。我如何返回一個填充數組?我需要 返回調用IPMapper.addIPArray的結果。我儘量讓回調 IPMapper.addIPMarker,但是這不是我所需要的(我只需要調用一個 功能和回報率得到了結果(有些情況下爲下一個高速緩存))。請致電 關於它的任何評論。

你可以從IPMapper.addIPArray返回的唯一事情是promise.You不能從一個異步操作返回其他任何東西,因爲它是異步,JavaScript的不能知道什麼時候該結果將是available.so

addIPMarker: function(ip, i, ip_array_length) { 
     var url = encodeURI(IPMapper.baseUrl + ip + "?callback=?"); 
     return $.getJSON(url, function(data) { 
     var latitude = data.latitude; 
     var longitude = data.longitude; 
     var latlng = new google.maps.LatLng(latitude, longitude); 
     var marker = new google.maps.Marker({ 
      draggable: false, 
      position: latlng 
     }); 
     IPMapper.markerArray.push(marker); 
    } 

然後

IPMapper.addIPArray(/*..arguments..*/).done(function(result) { 
       //continue the code here 
      }); 

http://api.jquery.com/category/deferred-object/

異步操作就像當你ç舔一些東西,你希望你的代碼執行點擊事件。你不知道什麼時候會發生點擊,你所能做的就是編寫一個點擊事件處理程序。

相關問題