1

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

将 bluebird 用于 Promise 规范,我尝试了几种方法Promise.method,我似乎无法让它们中的任何一个工作。Promise.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 任何人都可以指出最新代码中的明显错误或以承诺方式加载模块的伪代码示例。

4

1 回答 1

0

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

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

或更好

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

其次,defer 的方法不绑定到 defer 实例(JS 有动态 this),改用 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
        });
    });
}

等等。通常,最好使用 Promise 构造函数而不是 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
});

对于它的价值 - 我刚刚提出了这个问题,并且在 Bluebird 的未来版本中将给出更好的错误消息。

于 2014-04-22T20:37:29.887 回答