2014-04-22 2 views
1

나는 store locator를 빌드하고 require를 통해 사용자 정의 모듈을로드하고 있습니다. 사용자 지정 모듈은 방향 &에 의존합니다. Microsoft에서 제공하는 검색 모듈. 콜백 지옥이 싫어서 모듈을 미리로드하려면 모든 모듈이로드 된 후 커스텀 모듈에 대한 약속과 액션을 반환해야합니다.Microsoft 빙지도 api 및로드 모듈 문제

블루 버드를 약속 사양으로 사용하고 몇 가지 접근 방법을 시도했습니다. Promise.method, Promise.promisify, new Promise(function(resolve, reject){Microsoft.Maps.loadModule({callback:resolve})}) 나는 그 중 어떤 것도 작동하지 않는 것 같습니다.

내 최신 구현 : 사람이 지적 할 수 Uncaught TypeError: Cannot read property '_tryFollow' of undefined bluebird.js에서

function loadSearch() { 
      var resolver = Promise.defer(); 
      Microsoft.Maps.loadModule('Microsoft.Maps.Search', { 
       callback: resolver.resolve 
      }); 
      return resolver.promise; 
     } /* end loadSearch */ 

     function loadDirections() { 
      var resolver = Promise.defer(); 
      Microsoft.Maps.loadModule('Microsoft.Maps.Directions', { 
       callback: resolver.resolve 
      }); 
      return resolver.promise; 
     } 

Promise.all([loadSearch(), loadDirections()], function() { 
     //do something 
    }); 

결과 어떤 최신 코드에 명백한 오류 또는 약속의 방식으로 로딩 모듈의 사이비 코드 예제.

답변

0

두 가지 모두의 첫 번째 것들, 블루 버드 Promise.all는이 약속을 반환, 그런 두 번째 인수를 허용하지 않습니다 시도 :

Promise.all([loadSearch(), loadDirections()]).then(function(results) { 
    //do something 
}); 

또는 더 나은 모든

Promise.all([loadSearch(), loadDirections()]).spread(function(search,dirs) { 
    //do something 
}); 

둘째, 연기 메소드는 연기 인스턴스에 바인딩되지 않습니다 (JS는 동적입니다.) 대신 약속 생성자를 사용하십시오 :

function loadDirections() { 
    return new Promise(function(resolve){ 
     Microsoft.Maps.loadModule('Microsoft.Maps.Directions', { 
      callback: resolve // since this is not a method this is not bound 
     }); 
    }); 
} 

등등. 일반적으로 Bluebird의 지연된 인터페이스보다 약속 생성자를 선호하는 것이 좋습니다. 전체에서

: 그것은 가치가 무엇인지에 대한

function loadSearch() { 
    return new Promise(function(resolve){ 
     Microsoft.Maps.loadModule('Microsoft.Maps.Search', { 
      callback: resolve 
     }); 
    }); 
} 
function loadDirections() { 
    return new Promise(function(resolve){ 
     Microsoft.Maps.loadModule('Microsoft.Maps.Directions', { 
      callback: resolve 
     }); 
    }); 
} 
Promise.all([loadDirections(),loadSearch()]).spread(function(dir,search){ 
    //both done, results here 
}); 

는 - 그냥 블루 버드의 향후 버전에서 제공 될 문제가 더 나은 오류 메시지를 제기했습니다.

+0

@Esailija whoops : D 감사합니다. –

+0

Bluebird가이 경우 더 나은 오류 메시지를 제공합니다. https://github.com/petkaantonov/bluebird/commit/d8014cdef319da01a6bd0a076b5ab6f4b39ed3cc –

+0

아, API 문서에서 '.then()'을 찾지 못했지만 promise.defer에 대해 혼란스러워합니다.) 대 생성자. '.callback'에 대한 api [docs] (https://github.com/petkaantonov/bluebird/blob/master/API.md#callback---function)는 제가 가지고있는 것보다 지연된 것을 사용하는 정확한 예입니다. 에 대해 의견을 말하십시오. "이것은 새로운 약속을 사용하는 것보다 더 효과적인 약속 방법입니다." --- 또 다른주의 사항은 여기 또는 오후'Promise.promisify'에서 설명 할 수 있습니다. 나는'var promiseLM = Promise.promisifyAll (Microsoft.Maps.loadModule)'과 같은 것을 할 수 있어야하고'promiseLM(). then()'과 같은 것을 사용할 수 있어야한다고 느꼈다. – Fozz