Volgens mij is het niet handig om een functie te gebruiken die meteen een waarde moet teruggeven. Als dat niet lukt, moet je daarna zelf er achteraan gaan om te blijven checken.
Vandaar dat ik dus voorstel om de widget.system call te doen en dan gewoon even te wachten. Je weet immers dat er binnen 5 seconden 1 van de 2 dingen gebeurt: hij lukt en je krijgt een antwoord, of hij mislukt. En als je eigen timeout eenmaal in werking treedt, ben je toch niet meer geinteresseerd in de retourwaarde van widge.system: die waarde is er immers niet, anders had je die al binnengehad. Dus als je eenmaal .cancel() aanroept dan hoef je niet meer je normale endhandler te doen; die levert dan toch niets op!
Naar mijn idee levert de aanroep van growlDetect() dus geen direct resultaat op, maar zet het proces in gang. Na 5 seconden wordt je programma dan vanzelf voortgezet (afhankelijk van wat je zelf in je software verder programmeert natuurlijk).