2017-04-06 5 views
0

여기를 통해 데이터 목록을 처리해야합니다. 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

ES6 Promises가 아닌'$ .Deferred'를 사용하기로 선택한 이유는 무엇입니까? 덕분에 – trincot

답변

2

당신의 지오 코더 방법을 promisify 수 있습니다. 거기에 약간 정지 나의 문제는 지오 코더가 비동기는 점이다 :(,하지만. 그런 다음 당신이 할 수있는 약속을 반환 약속의 배열이 새로운 기능에 의해 생성 된 각을 만들 수 있습니다. 마지막으로, 해결하기 위해 모든 약속을 기다리는 결과를 연결하여 전반적인 geocodeByLocationIdByArray 방법의 약속 값으로 그것을 반환 할 $.when을 사용할 수 있습니다.

테스트되지 않은 코드이지만 아이디어를 얻을 수 있습니다.

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 ('지오 코더 오류가 발생했습니다', 오류); }} 오류가 발생했습니다. catch가 함수가 아닌 것처럼 보입니다. –

+0

아아, catch는 jQuery 3.0에서만 도입되었습니다. 그냥 버리거나'fail'을 대신 사용할 수 있습니다. – trincot