Как описано в заголовке, у меня есть задача запросить 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();
Я очень расстроен.