2017-04-06 39 views
0

我需要通過HERE Map geocoder處理數據列表,以將locationId轉換爲座標。 地理編碼器類具有地理編碼函數需要3個參數1個參數2. successCallFunction 3. failCallFunction。

self.geocodeByLocationIdByArray = function (locationIds, callback) 
      { 
       var deferred = $.Deferred(); 
       var result = []; 

       var convert = function() { 
        for (var i = 0; i < locationIds.length - 1; i++) 
        { 
         geocodingParameters = { 
          locationId: locationIds[i].locationId; 
         }; 
         self.geocoder.geocoder(geocodingParameters, onGeocodeSuccess, function() { }); 
        } 

       }; 

       convert(); 
       return deferred.promise(); 
      }; 

onGeocodeSuccess = function (result) { 

       var locations = result.Response.View[0].Result, 
        i; 
       var result = []; 
       // Add a marker for each location found 
       for (i = 0; i < locations.length; i++) { 
        result.push(new geoCoordinate(locations[i].Location.DisplayPosition.Latitude, locations[i].Location.DisplayPosition.Longitude)); 
       } 

       return result; 
      }; 

如何解決geocodeByLocationIdByArray功能等待,直到所有數據之前,並返回結果數組?我就那麼一點點停止:(我的問題是,地理編碼是異步。

+0

的[?我如何返回從一個異步調用的響應(可能的複製http://stackoverflow.com/questions/14220321/how-do-i-return-the-異步調用響應) –

+0

你不能,因爲它是異步的。它看起來像你正在傳遞一個回調函數,爲什麼一旦你得到你的結果不調用該函數? –

+0

你選擇使用'$ .Deferred'而不是ES6 Promise的任何原因? – trincot

回答

2

你可以promisify的地理編碼方法,所以它沒有得到一個回調作爲參數,但返回一個承諾,那麼你可以創建承諾的數組,每個這種新功能創建的。最後,你可以使用$.when等待所有這些承諾來解決,將結果連接並返回作爲整個geocodeByLocationIdByArray方法的承諾值。

這是未經測試的代碼,但您會發現:

self.geocodeByLocationIdByArray = function (locationIds) { 
    // Promisify geocoder: 
    function geocoderPromise(geocodingParameters) { 
     var deferred = $.Deferred(); 
     self.geocoder.geocoder(geocodingParameters, function() { 
      deferred.resolve(result); 
     }, function (err) { 
      deferred.reject(err); 
     }); 
     return deferred.promise(); 
    } 

    // Create an array of promises 
    var promises = locationIds.map(function (locationId) { 
     var geocodingParameters = { 
      locationId: locationIds[i].locationId; 
     }; 
     return geocoderPromise(geocodingParameters) 
      .then(onGeocodeSuccess) 
      .catch(function (err) { // or `fail` in jQuery < 3.0 
       console.log('geocoder error occurred', err); 
      }); 
    }); 
    // Wait for all promises to be resolved, and then concatenate the results 
    // as the final promised value. 
    return $.when.apply($, promises).then(function() { 
     return [].concat.apply([], arguments); 
    }); 
}; 

請注意,使用此代碼不再有回調參數,但您需要將返回值geocodeByLocationIdByArray()作爲承諾。所以,你可以這樣寫:

self.geocodeByLocationIdByArray([....ids....]).then(function (result) { 
    console.log(results); 
}); 
+0

謝謝。想法非常好! catch(function(err){console.log('geocoder error occurred,err); });它似乎是趕上不是一個函數 –

+0

啊是的,'catch'只在jQuery 3.0中引入。你可以放棄它,或者使用'fail'代替。 – trincot

相關問題