我目前正在制作一个“预制”项目,所以我不想改变太多。
我有一个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){
并保持其余代码不变?
谢谢!
答案 0 :(得分:3)
是的,您返回包含地图的已解决的承诺:
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)
的命名一致性。)
承诺的一个关键方面是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];