Microsoft bing映射api和加载模块问题



我正在构建一个商店定位器,并通过require加载一个自定义模块。自定义模块依赖于Directions&来自微软的搜索模块。我讨厌回调地狱,希望预加载模块,一旦加载完所有内容,就会在自定义模块上返回承诺和操作。

使用bluebird作为Promise规范,并且我已经尝试了几种方法Promise.methodPromise.promisifynew Promise(function(resolve, reject){Microsoft.Maps.loadModule({callback:resolve})}),但我似乎都无法使它们发挥作用。

我的最新实现:

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
    });

Uncaught TypeError: Cannot read property '_tryFollow' of undefined bluebird.js中的结果有人能指出最新代码中的一个明显错误吗?或者以promise方式加载模块的psuedo代码示例。

有两件事,首先,Bluebird中的Promise.all不接受第二个这样的参数,它返回一个promise,try:

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

或者更好的

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

其次,defer的方法没有绑定到defer实例(JS具有动态特性),而是使用promise构造函数:

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中的延迟接口,更喜欢promise构造函数。

总计:

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
});

值得一提的是,我刚刚提出了这个问题,在Bluebird的未来版本中会给出更好的错误消息。

最新更新