我正在构建一个商店定位器,并通过require加载一个自定义模块。自定义模块依赖于Directions&来自微软的搜索模块。我讨厌回调地狱,希望预加载模块,一旦加载完所有内容,就会在自定义模块上返回承诺和操作。
使用bluebird作为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
中的结果有人能指出最新代码中的一个明显错误吗?或者以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的未来版本中会给出更好的错误消息。