AMcoder - javascript, python, java, html, php, sql

AngularJS-ը մի քանի անգամ ընդունում է զանգերի խոստումը որոշ բացառություններով

Ես նախկինում տվել եմ այս հարցը (AngularJS-ը մի քանի անգամ մշակում է զանգերի խոստումը) և այժմ ես ունեն տարբեր խոչընդոտներ. Հիմա ես պետք է ստանամ քաղաքների ցուցակը, բայց կա բացառություն։

Քաղաքները կարող են մի քանի անգամ կոչվել երկրների պես (իմ հին հարցում), և ես պետք է պահեմ տվյալները՝ նույն տվյալների (քաղաքների) համար մի քանի զանգերը կանխելու համար: Հին հարցի լուծումը կարող է արգելափակել բազմաթիվ զանգեր, բայց հիմա ես պետք է թույլ տամ որոշ զանգեր (նոր երկրի քաղաքների համար):

Այսպիսով, իմ հարցն է. Ինչպե՞ս կարող եմ քեշավորել քաղաքների տվյալները՝ կանխելու նույն տվյալների կանչը: (Իմ գործառույթը պետք է պարզի, թե արդյոք զանգը վերաբերում է նոր երկրի քաղաքների ցանկին, թե ոչ: եթե այո, զանգահարեք ծառայություն և ստացեք քաղաքներ, եթե ոչ. վերադարձրեք քաղաքները քեշից)

Ահա իմ ծառայությունը.

var cityCache = {};
vm.getCities = function (countryCode) {

    if (countryCode!=undefined && !cityCache[countryCode]) {

        vm.cityPromise = $http({
            method: 'POST',
            cache: true,
            url: API + '/api/Global/CountryCities',
            data: {
                "CountryCode": countryCode
            }
        }).then(function successCallback(response,countryCode) {
            if (errorHandler(response.data)) {
                console.log("cities come from ajax")
                cityCache[response.config.data.CountryCode] = response.data;
                console.log(cityCache)
                return response.data
            }
        });
    } else {
        vm.cityPromise = $timeout(function () {//I use this to get promise object
            return cityCache[countryCode]
        }, 0)
        console.log("cities comes from cache");
    }

    return vm.cityPromise;
}

Օրինակ. Ենթադրենք, ես զանգում եմ getCities ֆունկցիան միաժամանակ 3 անգամ: Ես դիտում եմ իմ ցանցային տրաֆիկը քրոմի միջոցով: Ես տեսնում եմ 3 ajax զանգ: Դա նորմալ է. Բայց երբեմն զանգում եմ նույն քաղաքը: Ես պետք է խմբագրեմ իմ գործառույթը, որը կարող է հասկանալ, թե արդյոք քաղաքի տվյալները նախկինում արդեն կանչված են (քեշի տեսակ):
Օրինակ. Եթե ես 3 անգամ հարցնեմ ֆունկցիան այս արգումենտներով.

1-Տվեք ինձ Գերմանիայի քաղաքները,
2-Տվեք ինձ Իռլանդիայի քաղաքները,
3-Տվեք ինձ Գերմանիայի քաղաքները (կրկին),

Զանգում է 3 անգամ: Բայց ես ուզում եմ 1 զանգ Գերմանիայի համար, 1 զանգ Իռլանդիայի համար: Ընդամենը 2 զանգ։


  • Հարցն անհասկանալի է. Կոնկրետ ի՞նչ եք ուզում անել: Իսկ ի՞նչն է այն, որ չի աշխատում ձեր կոդում: 11.07.2016
  • Շնորհակալություն, ես հարցը խմբագրեցի։ 11.07.2016

Պատասխանները:


1

Նույն պատասխանը, ինչպես ձեր մյուս հարցին, պարզապես քարտեզագրեք երկրի կոդը խոստումով: Նույնը, ինչպես նախկինում, հաշվի առեք սխալի դեպքը:

var vm = this;

vm.cityPromises = {};

function getCities(countryCode) {
    if (!vm.cityPromises[countryCode]) {
        vm.cityPromises[countryCode] = $http({
            method: 'POST',
            cache: true,
            url: API + '/api/Global/Countries',
        }).then(function successCallback(response) {
            if (errorHandler(response.data)) {
                console.log("ajax")
                return response.data;
            }
        });
    } else {
        console.log("cache")
    }
    return vm.cityPromises[countryCode];
}
12.07.2016
  • Շնորհակալություն պատասխանի համար, ես գրել եմ իմ գործառույթը, ինչպես ձերն է, նախքան դուք պատասխանելը, և այն աշխատեց: :) Ես իմ լուծումը որպես պատասխան գրեցի այստեղ։ Կրկին շնորհակալություն! 13.07.2016

  • 2

    Այստեղ կարող եք օգտագործել ձեր սեփական խոստումը: Մի մոռացեք ներարկել $q ծառայությունը:

    var cityCache = {};
    
    vm.getCities = function (countryCode) {
    
        var deferred = $q.defer();
        if (countryCode!=undefined && !cityCache[countryCode]) {
            vm.cityPromise = $http({
                method: 'POST',
                cache: true,
                url: API + '/api/Global/CountryCities',
                data: {
                    "CountryCode": countryCode
                }
            }).then(function successCallback(response,countryCode) {
                if (errorHandler(response.data)) {
                    cityCache[response.config.data.CountryCode] = response.data;
                    deferred.resolve(response.data);
                }
                else{
                    deferred.reject();
                }
            });
        } 
        else {
             vm.cityPromise = $timeout(function () {//I use this to get promise object
                 deferred.resolve(cityCache[countryCode]);
            }, 0);
        }
    
        return deferred.promise;
    }
    
    11.07.2016
  • Խնդրում եմ ստուգեք իմ հին հարցը stackoverflow.com/questions /38303136/ Ես նույնպես ունեմ նույն խնդիրը ձեր օրինակի հետ: 11.07.2016

  • 3

    Փորձեք օգտագործել $q ծառայությունը angular-ից:

    թարմացվել է նույն քաղաքի բազմաթիվ զանգերը կանխելու համար.

    FIDDLE

    ծառայություն:

    .service("cityService", function($http, $q, $httpParamSerializerJQLike){
        //var callCache = {};
        var cityCache = {};
        return {
            getCities: function(countryCode){
    
                //if(callCache[countryCode] === undefined){
                      var promise = $q.defer();
               //     callCache[countryCode] = promise;
                //}else{
                //      console.log("return cached promise!!", callCache[countryCode]);
                //      return callCache[countryCode].promise;
                //}
    
                if (countryCode!=undefined && !cityCache[countryCode]) {
                        console.log("new city");
                    var data = $httpParamSerializerJQLike({
                        json: JSON.stringify({
                            name: countryCode+Math.random().toString(36).substring(7)
                        })
                    });
                    $http({
                        method: 'POST',
                        url:"/echo/json/",
                        data: data
                    }).then(function(risp) {
                            console.log("servicelog",risp.data);
                            cityCache[countryCode] = risp.data;
                        var obj = angular.extend({cache: false}, risp.data);
                        promise.resolve(obj);
                        //callCache[countryCode].resolve(obj);
                        //delete callCache[countryCode];
                    });
                }else{
                    setTimeout(function(){
                            var obj = angular.extend({cache: true}, cityCache[countryCode]);
                        promise.resolve(obj);
                        //callCache[countryCode].resolve(obj)
                        //delete callCache[countryCode];
                    }, 1000)
                }
                return promise.promise;
            }
        }  
    });
    
    11.07.2016
  • Խնդրում եմ ստուգեք իմ հին հարցը stackoverflow.com/questions /38303136/: Ես էլ եմ նույն խնդիրը քո օրինակի հետ կապված։ 11.07.2016
  • որտեղ է խնդիրը 12.07.2016
  • Ենթադրենք, ես զանգում եմ getCities ֆունկցիան միաժամանակ 15 անգամ: Ես դիտում եմ իմ ցանցային տրաֆիկը քրոմի միջոցով: Ես տեսնում եմ 15 ajax զանգ: Դա նորմալ է. Բայց երբեմն զանգում եմ նույն քաղաքը: Ես պետք է խմբագրեմ իմ գործառույթը, որը կարող է հասկանալ, թե արդյոք քաղաքի տվյալները նախկինում արդեն կանչված են (քեշի տեսակ): Օրինակ. Եթե ես 3 անգամ հարցնեմ ֆունկցիան այս արգումենտներով. Տվեք ինձ Գերմանիայի քաղաքները + Տվեք ինձ Իռլանդիայի քաղաքները + Տվեք ինձ Գերմանիայի քաղաքները (կրկին), դա զանգում է 3 անգամ: Բայց ես ուզում եմ 1 զանգ Գերմանիայի համար, 1 զանգ Իռլանդիայի համար: Ընդամենը 2 զանգ։ 12.07.2016

  • 4

    Ես լուծեցի իմ խնդիրը՝ ստեղծելով օբյեկտ խոստման համար և շատ շնորհակալություն @Luke Harper-ին, որ ինձ օգնել է նախկինում և հիմա :) Նրա պատասխանը նույնպես ճիշտ է, բայց ես պետք է մի քիչ ավելացնեմ իմ հավելվածի կոդը:

    Եթե ​​իմ կոդի մեջ որևէ խնդիր եք տեսնում, գրեք ինձ, որպեսզի ես խմբագրեմ պատասխանը

    Այսպիսով, ահա իմ լուծումը.

    vm.cityPromise = {};
    vm.getCities = function (countryCode) {
        vm.cityPromise["cityCache"] = countryCode;
        if (!vm.cityPromise[countryCode]) {
            if (countryCode != undefined && !cityCache[countryCode]) {
                vm.cityPromise[countryCode] = $http({
                    method: 'POST',
                    cache: true,
                    url: API + '/api/Global/CountryCities',
                    data: {
                        "CountryCode": countryCode
                    }
                }).then(function successCallback(response, countryCode) {
                    if (errorHandler(response.data)) {
                        cityCache[response.config.data.CountryCode] = response.data;
                        console.log("cities ajax, cityCache", cityCache)
                        return response.data
                    }
                },function error (response){
                    console.log ("error:",response)
                });
            } else {
                vm.cityPromise[countryCode] = $timeout(function () {
                    return cityCache[countryCode]
                }, 0)
                console.log("getCities cache");
            }
        }
        return vm.cityPromise[countryCode];
    }
    
    13.07.2016
    Նոր նյութեր

    Օգտագործելով Fetch Vs Axios.Js-ը՝ HTTP հարցումներ կատարելու համար
    JavaScript-ը կարող է ցանցային հարցումներ ուղարկել սերվեր և բեռնել նոր տեղեկատվություն, երբ դա անհրաժեշտ լինի: Օրինակ, մենք կարող ենք օգտագործել ցանցային հարցումը պատվեր ներկայացնելու,..

    Տիրապետել հանգստության արվեստին. մշակողի ուղեցույց՝ ճնշման տակ ծաղկելու համար
    Տիրապետել հանգստության արվեստին. մշակողի ուղեցույց՝ ճնշման տակ ծաղկելու համար Ինչպե՞ս հանգստացնել ձեր միտքը և աշխատեցնել ձեր պրոցեսորը: Ինչպես մնալ հանգիստ և զարգանալ ճնշման տակ...

    Մեքենայի ուսուցում բանկային և ֆինանսների ոլորտում
    Բարդ, խելացի անվտանգության համակարգերը և հաճախորդների սպասարկման պարզեցված ծառայությունները բիզնեսի հաջողության բանալին են: Ֆինանսական հաստատությունները, մասնավորապես, պետք է առաջ մնան կորի..

    Ես AI-ին հարցրի կյանքի իմաստը, այն ինչ ասում էր, ցնցող էր:
    Այն պահից ի վեր, երբ ես իմացա Արհեստական ​​ինտելեկտի մասին, ես հիացած էի այն բանով, թե ինչպես է այն կարողանում հասկանալ մարդկային նորմալ տեքստը, և այն կարող է առաջացնել իր սեփական արձագանքը դրա..

    Ինչպես սովորել կոդավորումը Python-ում վագրի պես:
    Սովորելու համար ծրագրավորման նոր լեզու ընտրելը բարդ է: Անկախ նրանից, թե դուք սկսնակ եք, թե առաջադեմ, դա օգնում է իմանալ, թե ինչ թեմաներ պետք է սովորել: Ծրագրավորման լեզվի հիմունքները, դրա..

    C++-ի օրական բիթ(ե) | Ամենաերկար պալինդրոմային ենթաշարը
    C++ #198-ի ամենօրյա բիթ(ե), Ընդհանուր հարցազրույցի խնդիր. Ամենաերկար պալինդրոմային ենթատող: Այսօր մենք կանդրադառնանք հարցազրույցի ընդհանուր խնդրին. Ամենաերկար palindromic substring...

    Kydavra ICAReducer՝ ձեր տվյալների ծավալայինությունը նվազեցնելու համար
    Ի՞նչ է ICAReducer-ը: ICAReducer-ն աշխատում է հետևյալ կերպ. այն նվազեցնում է նրանց միջև բարձր փոխկապակցված հատկանիշները մինչև մեկ սյունակ: Բավականին նման է PCAreducer-ին, չնայած այն..