织梦CMS - 轻松建站从此开始!

沙龙国际网上娱乐亚洲第一品牌-www.salon365.com

当前位置: 主页 > 沙龙国际365 >

关于js里promise的自调用疑惑。

时间:2017-07-17 20:43来源:未知 作者:admin 点击:
代码场景大致如下。要从redis里获取一个结果集列表,获取的时候先判断是否存在缓存,如果没的话先设置缓存再调用。先贴下函数声明的代码。 exports.totalRank = function () { var trDeferred

代码场景大致如下。要从redis里获取一个结果集列表,获取的时候先判断是否存在缓存,如果没的话先设置缓存再调用。先贴下函数声明的代码。

exports.totalRank = function () {
    var trDeferred = Q.defer();
    Q.all([
            RedisDB.getDailyRankList(),
            RedisDB.getWeeklyRankList(),
            RedisDB.getMonthlyRankList()
        ]).done(function (result) {
            if(cacheExistsChecker(result)){
                var returnResult = {
                    dailyRank: JSON.parse(result[0])[0].rank,
                    weeklyRank: JSON.parse(result[1])[0].rank,
                    monthlRank:JSON.parse(result[2])[0].rank,
                }
                trDeferred.resolve(returnResult);
            }else{
                CacheAction.setRanksLists().then(function(){
                    RankAction.totalRank().then(function(result){
                        trDeferred.resolve(result);
                    })
                });
            }
        })
    return trDeferred.promise;
}

调用该函数的代码如下:

RankAction.totalRank().then(function(result){
    console.log(result);
}).fail(function(err){
        console.log(err);
    });

调用该方法时候,缓存不存在,所以肯定是进入了else的流程。

现在疑惑就是:

重点关注函数声明那段代码,else里面的RankAction.totalRank().then()里面的trDeferred,该对象是第一次调用就return了的promise对象,还是第一次判断缓存不存在,然后再重新调用totalRank时候重新var的trDeferred?

个人的理解是第一次的trdeferred。因为如果这里不用RankAction.totalRank().then(xxxx),而是直接RankAction.totalRank(),则不返回结果。

求分析解惑一下。

织梦二维码生成器
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片
栏目列表
推荐内容