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

Sagu de uva com molho de baunilha

5 porções

Fácil

Ingredientes

Sagu de uva

  • 1 xícara(s) de chá de sagu
  • 400 mililitro (ml) de suco de uva integral
  • 4 colher(es) de sopa de açúcar
  • Canela e cravo a gosto
  • Água

Molho de baunilha

  • 1 litro(s) de leite
  • 2 colher(es) de sopa de amido de milho
  • 395 grama(s) de leite condensado
  • 1 colher(es) de sopa de essência de baunilha

Modo de preparo

Sagu de uva

Coloque o sagu na a, cubra com água (cerca de dois dedos acima das bolinhas) e deixe ferver até as bolinhas ficarem macias e transparentes.

A água ficará mais espessa por causa do amido, então adicione mais 400 ml e mexa por até 3 minutos.

Retire do fogo e escoe a água com a ajuda de uma peneira. Volte o sagu para a e acrescente o suco de uva integral, o açúcar, a canela e o cravo. Misture bem e cozinhe em fogo médio mexendo sempre para o sagu não grudar no fundo da a.

Deixe engrossar até reduzir cerca da metade do suco de uva (você pode conferir o ponto no vídeo acima). Retire e deixe resfriar na geladeira por pelo menos uma hora antes de montar as taças.

Molho de baunilha

Coloque numa a o leite, a gema de ovo, o leite condensado e a essência de baunilha. Ligue no fogo médio alto e cozinhe sem parar de mexer.

Quando começar a querer levantar fervura, abaixe um pouco o fogo e vá adicionando o amido de milho misturando bem com o auxílio de um fouet.

Coloque em fogo baixo e siga mexendo com o fouet até engrossar o creme (veja no vídeo o ponto). Pode ser servido morno ou resfriado.
Sagu de uva com molho de baunilha - 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.