我目前正在做一个“预制”项目,所以我试图不做太多改变.
我有一个promise函数,该函数在创建地图时会调用API并获取对象数组,但是它花费的时间过多,每次需要创建地图时都会被调用:
self.getStoreMapById = function(mapsId) {
var deferred = $q.defer();
$http.get("/api/stores/"+mapsId+'/map')
.then(function (response) {
deferred.resolve(response);
});
return deferred.promise;
}
(这就是它的调用方式:
Stores.getStoreMapById(CONfig.map.id).then(function(mapResp){
因此,为避免等待大量时间,我会在应用启动时调用一次该函数,并将数据保存在3个不同的全局变量中
if(maplevel1 == undefined ){
Stores.getStoreMapById(24).then(function(mapResp){
maplevel1 = mapResp.data;
});
} //same for maplevel2 and 3
现在,我要做的是,而不是每次需要创建地图时都使用此Stores.getStoreMapById来调用它,而是要有一个检查ID并将数据关联到另一个var的函数:
if(mapsId == "24"){
data = maplevel1;
}
if(mapsId == "23"){
data = maplevel2;
}
if(mapsId == "21"){
data = maplevel3;
}
有没有一种方法可以在promise函数中编写它,所以我可以调用:
assingMap(CONfig.map.id).then(function(mapResp){
并保持其余代码不变?
谢谢!
解决方法:
是的,您返回包含地图的已解决承诺:
function assignMap(mapsId) {
var map = /*...find the map in your variables...*/;
return $q.resolve(map); // With ES2015's promises, this would be
// `return Promise.resolve(map);`
}
它使用$q.resolve
来获得预解决的承诺. (这是$q.when的别名;用于与ES2015的Promise.resolve(value)保持命名一致性.)
Promise的一个关键方面是,即使已解决了Promise,then回调也总是异步调用,因此使用此回调的代码不会突然获得与以前不同的时序(除了延迟会更短).
重新“在变量中查找映射”部分,虽然您可以使用列出的长if / else if序列,但您可能想使用映射图:
var maps = Object.create(null);
maps[24] = maplevel1; // You can do away with the maplevel1, maplevel2,
maps[23] = maplevel2; // and maplevel3 variables entirely if you create
maps[21] = maplevel3; // the map in the code getting these up front
然后:
var map = maps[mapsId];
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。