Skip to main content

Немного профита от локальных функций

Представим себе ситуацию: приходят некие данные, нам нужно запростить у пользователя подтверждение, и в зависимости от ответа пользователя, обработать эти данные тем или иным способом.

Это будет выглядеть как-то так:


public function ProcessInvitation(event : ConferenceInvitationEvent) : void
{
	var msg : String = event.senderName + ' invites you to conference';

	Alert.yesLabel = 'Accept';
	Alert.noLabel = 'Decline';
	Alert.show(msg, 'Invitation', Alert.YES | Alert.NO | Alert.NONMODAL, null, Answer);
	Alert.yesLabel = 'Yes';
	Alert.noLabel = 'No';
}

private function Answer(ev : CloseEvent) : void
{
	if(ev.detail == Alert.YES) // do something
	else // do something esle
}

Все хорошо, но вот досада -- в функции Answer нам нужно знать, какие данные обрабатывать. То есть, там нужно иметь ConferenceInvitationEvent. Ну не беда, сохраним это временно в свойстве класса да и обработаем.

Но не катит. Пока пользователь думает над одним запросом, за это время может придти еще N других. И в фукнции Answer надо как-то определять, а на какой из N запросов был дан ответ пользователем. И тут начинаешь думать в направлении, как бы завести хеш для хранения необработанных запросов, как бы передать нужный ключ через Alert в функцию Answer, чтобы по нему взять нужные данные. А можно ли вообще что-то кастомное передать через Alert? Надо гуглить, экспериментировать.

Внезапно -- бац. Да все гораздо проще! Answer должен быть локальной функцией!


public function ProcessInvitation(event : ConferenceInvitationEvent) : void
{
	var msg : String = event.senderName + ' invites you to conference';

	// NOTE: we use local function and have event in scope of this function
	var Answer : Function = function(ev : CloseEvent) : void
	{
		fmsService.AnswerToInvitationToConference(event.senderID, 
			event.conferenceID, ev.detail == Alert.YES);
	}

	Alert.yesLabel = 'Accept';
	Alert.noLabel = 'Decline';
	Alert.show(msg, 'Invitation', Alert.YES | Alert.NO | Alert.NONMODAL, null, Answer);
	Alert.yesLabel = 'Yes';
	Alert.noLabel = 'No';
}

Здесь ConferenceInvitationEvent сразу попадает в область видимости локальной функции, и не нужно придумывать никакого гемора с хешами и ключами. PROFIT :)

Вообще-то раньше я нечасто применял локальные функции. Потом как-то заюзал замыкания. А теперь и такие вот фишки.

Еще пару бонусов:

http://juick.com/yzh44yzh/432378 -- тут о том, что я думаю по поводу Alert.yesLabel = 'Accept'

http://juick.com/yzh44yzh/432419 -- тут небольшой холиварчик на тему флекс -- говно

Кто еще не в жуйке? Вы многое теряете :)

No votes yet