Solución:
function GetHours() {
return $.ajax({
...
});
};
$ .ajax () devuelve una promesa. $ .when () toma una colección de Promises y devuelve una promesa que se completa cuando se completan todas las promesas de entrada. Then () es un método en Promise (en este caso, el envoltorio Promise que when () creó) que llama a su primer función arg cuando la promesa se resuelve con éxito.
por lo tanto, su GetHours necesita devolver una Promise que when () puede ajustarse, y usted llama al then () on. en realidad, podría omitir la parte when () y simplemente llamar a .then al regresar de GetHours.
no obtiene un error porque .when () también toma cualquier objeto antiguo, y si no implementa la interfaz Promise, simplemente lo trata como una Promise ya completada.
Este no es el problema de los OP, pero sucedió algo similar y fue porque estaba llamando a $ .when (…) incorrectamente al pasar una serie de promesas.
Según la documentación de jQuery, cuando si desea esperar varios objetos diferidos, debe realizar la llamada como tal:
$.when( d1, d2 ).then(....);
Eso significa que si tiene varios objetos diferidos en una matriz, debe usar solicitar(…), de lo contrario $ .when no funcionará correctamente. Entonces, su llamada para una matriz de objetos diferidos se vería así:
$.when.apply(this, arrayOfDeferred).then(....);
Aquí hay un JS Fiddle que demuestra esto:
https://jsfiddle.net/Lvo4hrez/11/