Portanto, você é uma função lambda e deve executar seu retorno de chamada assim que tiver seu resultado.
Às vezes, porém, você já terá o resultado. Talvez você tenha armazenado em cache o resultado e não precise fazer aquela chamada lenta para o sistema de arquivos.
Você deve executar o callback imediatamente?
Não, aqui está o porquê
O chamador pode estar dependendo de você para esperar sua vez. Nem sempre é o caso, mas você não pode definir quem liga para você. Portanto, não assuma.
Lembre-se, enquanto escrevo o código javascript, espero que cada linha dele seja executada antes que qualquer função de retorno de chamada seja acionada.
exemplo
function ImpatientServer() {} // extend EventEmitter
ImpatientClass.prototype.listen = function(port, cb) {
this.emit('listening'); // let others react
return cb();
};
var server = new ImpatientServer();
server.listen(8080, function(err) {
console.log('hello from the callback');
});
console.log('attaching a listener');
server.on('listening', function() {
console.log('sadly, I will not be called');
});
O resultado deste exemplo é:
1> hello from the callback
2> attaching a listener
No entanto, esperaríamos esta saída:
1> attaching a listener
2> hello from the callback
3> sadly, I will not be called
o método preferido
Sempre faça algum tipo de bloqueio antes de executar seu retorno de chamada.
// return the callback ASAP (but not now)
process.nextTick(function() { return cb(); });
// or in the browser set 0 delay timeout
setTimeout(function() { return cb(); }, 0);
// or most likely, pass the callback to something
db.runQuery(params, cb); // you deal with it
Sim, queremos bloqueio. É por isso que você está aceitando um retorno de chamada. Apenas … não bloqueie por mais tempo do que o necessário.
Normalmente, você não precisa pensar sobre isso. Provavelmente, você passará sua função de retorno de chamada para outras funções de bloqueio, como HTTP ou operações de sistema de arquivos.
A única boa razão real para ter um resultado imediatamente disponível é se você estiver armazenando em cache os resultados de outras operações de bloqueio.
Se você alguma vez tiver um retorno de chamada e um resultado imediato, não fique tentado a retornar o resultado imediatamente!