buenas...
no lo he intentado pero es lo que se me ocurre. realizar la peticion mediante un temporizador setTimeout de tal modo que en cada pulsacion de la tecla cancelas el temporizador y creas uno nuevo. cuando el usuario no presiona una tecla por el periodo de tiempo establecido en setTimeout, entonces ahi es que se envia la peticion.
tambien se puede hacer mas complejo. por ejemplo, tienes una variable booleana para controlar la peticion, asumiendo que false indica que no hay ninguna peticion en espera y true lo contrario. de forma tal que cuando el usuario escribe algo se revisa el estado de la variable. si esta en true, no se realiza la peticion. luego que la peticion se complete se restaura la variable y se revisa si el valor del campo ha cambiado. en tal caso, vuelve a realizar la peticion cambiando el estado de la variable.
por supuesto, en estas dos ideas activadas mediante eventos del teclado.