;(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

Molho branco com mortadela defumada e aspargos

20 min

4 porções

Fácil

Ingredientes

  • 1/2 xícara(s) de chá de manteiga
  • 1 cebola
  • 2 dente(s) de alho
  • 500 mililitro (ml) de creme de leite fresco
  • 2 colher(es) de sopa de nata (opcional)
  • 150 grama(s) de aspargos
  • 150 grama(s) de mortadela defumada
  • 100 grama(s) de queijo parmesão

Modo de preparo

Pique a cebola em cubinhos e corte a mortadela defumada em tirinhas. Reserve. Numa a, coloque um fio generoso de azeite de oliva e deixe esquentar um pouco antes de adicionar a cebola. Mexa um pouco e, em seguida, acrescente a manteiga e rale diretamente na a o alho. Mexa bem tomando cuidado para não dourar a cebola. Reserve. Em uma frigideira à parte, coloque um fio generoso de azeite de oliva e, enquanto ela vai esquentando, pique os aspargos. Com a frigideira bem quente, coloque os aspargos e mexa-os bem ? a ideia é tostar sem queimar. Quando estiverem tostadinhos (veja no vídeo o ponto), adicione sal e pimenta-do-reino. Em seguida, na mesma frigideira coloque a mortadela em fatias e salteie com os aspargos. A próxima etapa é voltar a a com a cebola e o alho ao fogo, esquentar, e juntar o preparo da frigideira a essa a. Mexa bem para incorporar todos os ingredientes. Acrescente em seguida o creme de leite fresco e a nata (esta opcional). Deixe ir reduzindo o molho, mexendo algumas vezes, até ficar espesso. Sugestão para servir com massa: para cada prato, em uma frigideira aquecida coloque duas a três conchas do molho, deixe esquentar um pouco e, em seguida, coloque a quantidade de massa (no programa, sugere-se o capeletti, mas pode ser a pasta da sua preferência) para uma pessoa, mexa bem e rale diretamente um pouco que queijo parmesão antes de servir a porção individual. Repita a operação paras as demais porções.
Capeletti ao molho caruso revisitado - Cozinha Por Aí/UOL - Cozinha Por Aí/UOL
Imagem: Cozinha Por Aí/UOL

Receita do programa "Cozinha por Aí" de Nossa. Veja mais episódios que mostram como uma receita base pode se transformar em dois pratos diferentes.

Quer ver mais dicas de cozinha?
Confira no YouTube de Nossa.