微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

javascript-需要一些帮助,使一个使用.then的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){

并保持其余代码不变?

谢谢!

解决方法:

是的,您返回包含地图的已解决承诺:

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] 举报,一经查实,本站将立刻删除。

相关推荐