我正在构建商店定位器并通过require加载自定义模块。自定义模块取决于Directions&来自microsoft的搜索模块。我讨厌回调地狱,并希望预先加载模块,一旦所有内容都加载,就会在自定义模块上返回一个promise和action。
将蓝鸟用于Promise规范,我尝试了多种方法Promise.method
,Promise.promisify
,new 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
任何人都可以指出最新代码中的明显错误或以承诺方式加载模块的伪代码示例。
答案 0 :(得分:0)
两件事,首先,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有动态这个),而是使用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的未来版本中提供更好的错误消息。