retorno de chamada corretamente com resultado imediato

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!