Сделайте два AJAX запроса, сохраните результаты в localStorage и верните true, если все в порядке - PullRequest
0 голосов
/ 17 апреля 2020

Как описано в заголовке, у меня есть задача запросить 2 URL с некоторыми данными POST и сохранить ответ в localStorage. Все это упаковано в функцию (или что-то еще), которая возвращает true, если все сделано и не было ошибок.

Я не так хорош в JS (я специализируюсь на HTML / CSS frontend dev) и попытка сделать это с моим ограниченным пониманием обещаний приводит к большому беспорядку в коде, который всегда повторяет обещание. Но здесь у вас есть что посмеяться:

(function(win, doc) {
    'use strict';

    win.project.portal = {

        api: '/proxy.php',

        storeProducts: async function() {
            let self = this;
            let requests = [];

            self.search = JSON.parse( localStorage.getItem( 'search' ) );
            if ( self.search == null )
            {
                self.panic( 'No query' );
                return;
            }

            if ( self.search[ 'demand[]'] == 'gas' || self.search[ 'demand[]'].includes( 'gas' ) )
            {
                var requestData = {
                    customerType: self.search.audience,
                    mediaType: 'GAS',
                    pointOfConsumption: {
                        postalCode: self.search.postal.match( /^\d{5,}/ )[0],
                        city: self.search.town.replace( /^\d{5,}\s/, '' ),
                    },
                    consumptions: {
                        DEFAULT_TARIFF: self.search[ 'gas-usage' ],
                    }
                };
                requests.push( requestData );
            }

            if ( self.search[ 'demand[]'] == 'power' || self.search[ 'demand[]'].includes( 'power' ) )
            {
                var requestData = {
                    customerType: self.search.audience,
                    mediaType: 'POWER',
                    pointOfConsumption: {
                        postalCode: self.search.postal.match( /^\d{5,}/ )[0],
                        city: self.search.town.replace( /^\d{5,}\s/, '' ),
                    },
                    consumptions: {
                        DEFAULT_TARIFF: self.search[ 'power-usage' ],
                    }
                };
                requests.push( requestData );
            }
            const allRequests = requests.map( req =>
                self.fetch( req ).then(response => response)
            );

            return await Promise.all(allRequests).then( function( responses )
            {
                return self.processProducts( responses );
            });
        },
        processProducts: function( responses )
        {
            let self = win.project.portal;
            let state = false;
            console.log(responses);

            responses.forEach( function( response )
            {
                if ( response.status === 'SUCCESS' )
                {
                    let storage = {};
                    storage[ response.tariffs[0][ 'mediaType' ] ] = response.tariffs;
                    localStorage.setItem( 'results', JSON.stringify( storage ) );
                    state = true;
                }

                if ( response.status === 'ERROR' )
                {
                    console.log( response.errors[0].message );
                    localStorage.setItem( 'results', JSON.stringify( {} ) );
                    state = false;
                }
            });
            return state;
        },

        fetch: async function ( requestData )
        {
            if ( typeof requestData === 'undefined' || requestData === null )
            {
                self.panic( 'Keine Request Daten' );
                return;
            }
            let url = win.project.portal.api;

            // Default options are marked with *
            const response = await fetch( url, {
                method: 'POST',
                mode: 'cors',
                cache: 'no-cache',
                credentials: 'same-origin',
                headers: {
                    'Content-Type': 'application/json'
                },
                redirect: 'follow',
                referrerPolicy: 'no-referrer',
                body: JSON.stringify( requestData )
            });
            return response.json();
        },

        /* talk about request problems */
        panic: function( msg )
        {
            console.error( msg );

        },
    };

})(window, document);

Моя цель - вызвать project.portal.storeProducts (), которое должно вернуть логическое значение. Что-то вроде if ( project.portal.storeProducts() ) doSomeThingElse();

Я очень расстроен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...