【问题标题】:How to avoid require avalanches with node.js?node.js 如何避免需要雪崩?
【发布时间】:2016-08-08 21:39:39
【问题描述】:

我想在节点服务器中缓存一些数据:

像这样的 rpc 数据提供者:

var cnt = 0;
function rpcDataProvider(areaId) {
    return Q.delay(100).then(() => {
        cnt += 1
        console.log("I am rpcDataProvider and I am not so fast. I am requested " + cnt + " times.");
        const base = areaId * 10;
        var arr = [];
        for (var i = 0; i < 10; i ++) {
            arr.push(base + i);
        }
        return arr;
    })
}

http 服务器

// cache data
var provinceList;
var cityList;
var countyList;

function getProvinceList() {
    if (provinceList && provinceList.length > 0) return Q.resolve(provinceList);
    return rpcDataProvider(1).then((rv) => {
        provinceList = rv;
        return rv;
    });
}

function getCityList() {
    if (cityList && cityList.length > 0) return Q.resolve(cityList);

    return getProvinceList().then((provinceList) => {
        return Q.all(provinceList.map((item) => rpcDataProvider(item))).then(rvs => {
            cityList = rvs.reduce((prev, cur) => prev.concat(cur));
            return cityList;
        });

    });
}

function getCountyList() {
    if (countyList && countyList.length > 0) return Q.resolve(countyList);

    return getCityList().then((cityList) => {
        return Q.all(cityList.map((item) => rpcDataProvider(item))).then(rvs => {
            countyList = rvs.reduce((prev, cur) => prev.concat(cur));
            return countyList;
        })
    })
}

function api1() {
    console.log("I am http api1");
    return getProvinceList();
}

function api2() {
    console.log("I am http api2");
    return getCityList();
}

function api3() {
    console.log("I am http api3");
    return getCountyList();
}

function api4() {
    console.log("I am http api4");
    return getCountyList();
}

function api5() {
    console.log("I am http api5");
    return getCountyList();
}

客户请求:

function httpRequest() {
    console.log("I am client.");
    Q.all([api1(), api2(), api3(), api4(), api5()]);
}

httpRequest();

问题是parallel请求缓存不起作用

【问题讨论】:

    标签: node.js caching promise q


    【解决方案1】:

    不要缓存承诺值。缓存承诺。

    // cache data
    var provinceList;
    var cityList;
    var countyList;
    
    function rpcReduceAndConcat(list) {
        return Q.all(list.map(rpcDataProvider)).then(rvs => {
            return rvs.reduce((prev, cur) => prev.concat(cur));
        });
    }
    
    function getProvinceList() {
        if (!provinceList) provinceList = rpcDataProvider(1);
        return provinceList;
    }
    
    function getCityList() {
        if (!cityList) cityList = getProvinceList().then(rpcReduceAndConcat);
        return cityList;
    }
    
    function getCountyList() {
        if (!countyList) countyList = getCityList().then(rpcReduceAndConcat);
        return countyList;
    }
    

    【讨论】:

      猜你喜欢
      • 2020-05-17
      • 2017-07-09
      • 1970-01-01
      • 1970-01-01
      • 2011-05-04
      • 2017-01-03
      • 1970-01-01
      • 2015-10-15
      • 2011-05-18
      相关资源
      最近更新 更多