【问题标题】:Microsoft bing maps api and loading modules issueMicrosoft bing 地图 api 和加载模块问题
【发布时间】:2014-04-23 05:02:52
【问题描述】:

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

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

结果为@​​987654325@ 谁能指出最新代码中的明显错误或以承诺方式加载模块的伪代码示例。

【问题讨论】:

    标签: promise bluebird


    【解决方案1】:

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

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

    等等。一般来说,在 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 的未来版本中会提供更好的错误消息。

    【讨论】:

    • @Esailija 哎呀:D 谢谢你的收获。
    • Bluebird 现在将在这种情况下提供更好的错误消息github.com/petkaantonov/bluebird/commit/…
    • 啊错过了 api 文档中的 '.then()',但我对 promise.defer() 与构造函数感到困惑。 .callback 的 api docs 是我使用 deferred 的一个确切示例,甚至对“这是比使用 new Promise. 更有效的承诺方式”发表评论 --- 在另一个说明中,您可以在这里解释或在下午Promise.promisify。我觉得我应该能够做类似var promiseLM = Promise.promisifyAll(Microsoft.Maps.loadModule) 的事情并使用类似promiseLM().then() 的东西
    • Promise.promisify 和 promisifyAll 用于 nodebacks - 一种编写 Microsoft.Maps 不做的回调的方式(至少从我这里可以看出)。您可以在这里了解更多信息:stackoverflow.com/questions/22519784/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-17
    • 1970-01-01
    相关资源
    最近更新 更多