需要一些帮助制作一个使用.then的承诺函数

时间:2016-08-18 17:46:55

标签: javascript promise

我目前正在制作一个“预制”项目,所以我不想改变太多。

我有一个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){

并保持其余代码不变?

谢谢!

1 个答案:

答案 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];