;(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();
})();
O Pho é uma refeição comum no Vietnã, servida em diferentes horários do dia, do café da manhã à tarde da noite. No vietnamita original, sua grafia é Pho bò (a pronúncia é algo como fuh bóóó), em que "Pho" significa noodle de arroz e "bò", carne. Tem um longo tempo de cozimento do caldo (cerca de 10 horas), mas vale cada colherada.
Ingredientes
500 grama(s) de talharim de arroz desidratado
400 grama(s) de carne bovina (músculo ou outra de preferência)
400 grama(s) de osso bovino
8 unidades de cebolinha
4 anises-estrelados
4 cravos
2 limões cortados em rodelas
1 canela em pau
1 pedaço de gengibre descascado em rodelas de cerca de 2,5 centímetros
1 cebola cortada em quatro, sem descascar
2 colher(es) de sopa de molho de peixe (nam pla ou nuoc mam, disponíveis nos mercados asiáticos) ou molho de soja
Pimenta-preta moída na hora a gosto
Sal a gosto
400 grama(s) de filé-mignon cortado em tiras finas
12 bolinhos de carne pré-cozidos
Hortelã para acompanhar
Manjericão para acompanhar
Coentro para acompanhar
Modo de preparo
Hidrate a massa: mergulhe o macarrão de arroz por 60 minutos em água fria para remover o excesso de amido e, depois, por 30 minutos em água quente. Escorra e reserve.
O caldo do Pho Bo deve ser cozido por, no mínimo, 10 horas. Misture os ossos e a carne bovina de preferência com anis-estrelado, canela, gengibre, cebola e cravo em uma a com água fervente.
Quando a mistura ferver, abaixe o fogo e deixe cozinhar, sem mexer, por 60 minutos.
Retire a carne bovina, reserve e deixe o caldo no fogo baixo por mais oito horas, dependendo de quanto tempo você tem disponível. Quanto mais tempo de cozimento (até cerca de 12 horas no total), mais saboroso ficará o caldo.
Ao fim do tempo, coe o caldo e volte para o fogão, desta vez em fogo médio.
Adicione molho de peixe (ou molho de soja) e pimenta a gosto. Prove e adicione sal ou mais temperos, se necessário.
Quando o caldo estiver pronto, coloque a a de água para ferver, adicione o macarrão e ferva por 30 segundos, secando bem.
Aqueça quatro bowls grandes, enchendo-os com água quente e, depois, descartando-a.
Divida o macarrão entre os bowls e distribua as lâminas de filé-mignon cru sobre o macarrão.
Acrescente cebolinha picada e pedaços do talo cortados grosseiramente.
Adicione três bolinhos de carne em cada bowl.
Cubra o macarrão com caldo - o líquido quente vai cozinhar as lâminas de filé-mignon.
Sirva a sopa, acompanhada por rodelas de limão com cebolinha e as ervas oferecidas à parte, para serem adicionadas ao prato conforme o gosto pessoal.
ID: {{comments.info.id}}
URL: {{comments.info.url}}
Ocorreu um erro ao carregar os comentários.
Por favor, tente novamente mais tarde.
{{comments.total}} Comentário
{{comments.total}} Comentários
Seja o primeiro a comentar
Essa discussão está encerrada
Não é possivel enviar novos comentários.
Essa área é exclusiva para você, , ler e comentar.
Só s do UOL podem comentar
Ainda não é ? Assine já.
Se você já é do UOL, faça seu .
O autor da mensagem, e não o UOL, é o responsável pelo comentário. Reserve um tempo para ler as Regras de Uso para comentários.