;(function() { window.createMeasureObserver = (measureName) => { var markPrefix = `_uol-measure-${measureName}-${new Date().getTime()}`; performance.mark(`${markPrefix}-start`); return { end: function() { performance.mark(`${markPrefix}-end`); performance.measure(`uol-measure-${measureName}`, `${markPrefix}-start`, `${markPrefix}-end`); performance.clearMarks(`${markPrefix}-start`); performance.clearMarks(`${markPrefix}-end`); } } }; /** * Gerenciador de eventos */ window.gevent = { stack: [], RUN_ONCE: true, on: function(name, callback, once) { this.stack.push([name, callback, !!once]); }, emit: function(name, args) { for (var i = this.stack.length, item; i--;) { item = this.stack[i]; if (item[0] === name) { item[1](args); if (item[2]) { this.stack.splice(i, 1); } } } } }; var runningSearch = false; var hadAnEvent = true; var elementsToWatch = window.elementsToWatch = new Map(); var innerHeight = window.innerHeight; // timestamp da última rodada do requestAnimationFrame // É usado para limitar a procura por elementos visíveis. var lastAnimationTS = 0; // verifica se elemento está no viewport do usuário var isElementInViewport = function(el) { var rect = el.getBoundingClientRect(); var clientHeight = window.innerHeight || document.documentElement.clientHeight; // renderizando antes, evitando troca de conteúdo visível no chartbeat-related-content if(el.className.includes('related-content-front')) return true; // garante que usa ao mínimo 280px de margem para fazer o lazyload var margin = clientHeight + Math.max(280, clientHeight * 0.2); // se a base do componente está acima da altura da tela do usuário, está oculto if(rect.bottom < 0 && rect.bottom > margin * -1) { return false; } // se o topo do elemento está abaixo da altura da tela do usuário, está oculto if(rect.top > margin) { return false; } // se a posição do topo é negativa, verifica se a altura dele ainda // compensa o que já foi scrollado if(rect.top < 0 && rect.height + rect.top < 0) { return false; } return true; }; var asynxNextFreeTime = () => { return new Promise((resolve) => { if(window.requestIdleCallback) { window.requestIdleCallback(resolve, { timeout: 5000, }); } else { window.requestAnimationFrame(resolve); } }); }; var asyncValidateIfElIsInViewPort = function(promise, el) { return promise.then(() => { if(el) { if(isElementInViewport(el) == true) { const cb = elementsToWatch.get(el); // remove da lista para não ser disparado novamente elementsToWatch.delete(el); cb(); } } }).then(asynxNextFreeTime); }; // inicia o fluxo de procura de elementos procurados var look = function() { if(window.requestIdleCallback) { window.requestIdleCallback(findByVisibleElements, { timeout: 5000, }); } else { window.requestAnimationFrame(findByVisibleElements); } }; var findByVisibleElements = function(ts) { var elapsedSinceLast = ts - lastAnimationTS; // se não teve nenhum evento que possa alterar a página if(hadAnEvent == false) { return look(); } if(elementsToWatch.size == 0) { return look(); } if(runningSearch == true) { return look(); } // procura por elementos visíveis apenas 5x/seg if(elapsedSinceLast < 1000/5) { return look(); } // atualiza o último ts lastAnimationTS = ts; // reseta status de scroll para não entrar novamente aqui hadAnEvent = false; // indica que está rodando a procura por elementos no viewport runningSearch = true; const done = Array.from(elementsToWatch.keys()).reduce(asyncValidateIfElIsInViewPort, Promise.resolve()); // obtém todos os elementos que podem ter view contabilizados //elementsToWatch.forEach(function(cb, el) { // if(isElementInViewport(el) == true) { // // remove da lista para não ser disparado novamente // elementsToWatch.delete(el); // cb(el); // } //}); done.then(function() { runningSearch = false; }); // reinicia o fluxo de procura look(); }; /** * Quando o elemento `el` entrar no viewport (-20%), cb será disparado. */ window.lazyload = function(el, cb) { if(el.nodeType != Node.ELEMENT_NODE) { throw new Error("element parameter should be a Element Node"); } if(typeof cb !== 'function') { throw new Error("callback parameter should be a Function"); } elementsToWatch.set(el, cb); } var setEvent = function() { hadAnEvent = true; }; window.addEventListener('scroll', setEvent, { capture: true, ive: true }); window.addEventListener('click', setEvent, { ive: true }); window.addEventListener('resize', setEvent, { ive: true }); window.addEventListener('load', setEvent, { once: true, ive: true }); window.addEventListener('DOMContentLoaded', setEvent, { once: true, ive: true }); window.gevent.on('allJSLoadedAndCreated', setEvent, window.gevent.RUN_ONCE); // inicia a validação look(); })();
  • AssineUOL
Topo

Amazon testa depósitos baratos para evitar caos em Cyber Monday

Foto: Mike Segar/Reuters
Imagem: Foto: Mike Segar/Reuters

Spencer Soper

02/12/2019 14h06

A Amazon.com se prepara para a temporada de compras de Natal on-line - a agitada Cyber Monday - com ajustes em seu sistema de entregas para garantir que os pedidos cheguem aos clientes a tempo. Para isso, a empresa está testando um novo serviço de estoque para ajudar a atender à demanda do fim do ano e a promessa de envio no dia seguinte, sem superlotar os depósitos ou ficar sem produtos.

O novo serviço, chamado de Amazon Storage and Replenishment, permite que lojistas estoquem mercadorias em locais próximos à operação de entregas da Amazon. Com isso, os produtos podem ser repostos rapidamente, segundo documentos vistos pela Bloomberg. A Amazon testa o programa em Ontário, na Califórnia, a cerca de 32 quilômetros de suas instalações mais próximas e tem planos de expandir o programa para outros locais do país, de acordo com os documentos.

Depois de gastar bilhões de dólares para construir uma sofisticada rede de depósitos altamente automatizados que usam robôs, correias transportadoras e milhares de pessoas para embalar e enviar produtos rapidamente, a empresa agora foca numa inovação decididamente do século XX: depósitos de baixo custo.

A Amazon enfrenta desafios de capacidade durante as compras natalinas, que incluem a Cyber Monday, quando consumidores dos Estados Unidos devem gastar um recorde de US$ 9,4 bilhões on-line. A Amazon compartilha espaço de depósito com comerciantes que vendem produtos em seu marketplace, e a empresa já aumentou as taxas para estoque durante a temporada de festas para desencorajar esses parceiros de lotar os centros com muitos produtos.

Mas isso apresenta o risco de os comerciantes adotarem uma estratégia muito cautelosa, e de a Amazon perder vendas quando os itens acabarem. Também pode frustrar parceiros da Amazon, que podem ter de pagar uma conta alta para guardar produtos que não estão vendendo. O novo serviço procura solucionar os dois problemas: liberar espaço em instalações caras, mantendo o estoque de backup por perto.

"A Amazon tenta descobrir como fornecer um serviço de logística que os comerciantes paguem, sem ficar com os depósitos cheios de itens que ninguém compra", diz Juozas Kaziukenas, fundador da empresa de pesquisa de comércio eletrônico Marketplace Pulse, em Nova York. "Muitos vendedores são inexperientes em lidar com isso e perdem muito dinheiro com taxas."

O serviço é mais uma iniciativa da Amazon para aumentar o alcance na cadeia de fornecedores e controlar o fluxo de mercadorias no trajeto das fábricas até a casa dos clientes. Ao assumir um maior controle da logística, a Amazon se torna menos suscetível ao aumento dos custos das entregas, como o ocorrido em 2013 nos EUA e dois anos depois no Reino Unido.

A Amazon a por uma transição de varejista on-line para uma plataforma e canal de entrega de comércio eletrônico. Mais da metade de todos os produtos vendidos no site da empresa são de lojistas independentes que pagam comissões para cada venda. A Amazon continua examinando todos os segmentos da cadeia de fornecedores em busca de maneiras de tornar as compras on-line tão rápidas e íveis quanto uma rápida visita às lojas.

A Amazon não quis comentar.