Показать сообщение отдельно
  #19 (permalink)  
Старый 31.10.2011, 06:43
Профессор
Отправить личное сообщение для with-love-from-siberia Посмотреть профиль Найти все сообщения от with-love-from-siberia
 
Регистрация: 14.12.2009
Сообщений: 155

Тема интересная. Что-то подобное уже обсуждалось в другой ветке на форуме. К сожалению все это по большей части "завязано" на браузерную среду либо "тянет" за собой целый ворох полезных, но не всегда нужных методов. Например, в среде WSH нет методов window.setTimeout/setInterval (да и объекта такого нет, хотя его просто получить, например new ActiveXObject('htmlfile').parentWindow). Тем не менее в WSH встречаются задачи, которые требуют синхронизации данных между основным потоком исполнения и потоком, выполняющимся асинхронно. Конкретный пример - временные потребители, следящие за изменением состояния служб Windows:
var wmi = GetObject('winmgmts:\\\\.\\Root\\CIMV2');
var query = 'SELECT * FROM __InstanceModificationEvent WITHIN 5 WHERE TargetInstance ISA "Win32_Service"';
var sink = WScript.CreateObject('WbemScripting.SWbemSink', 'Sink_');
wmi.ExecNotificationQueryAsync(sink, query);

function Sink_OnObjectReady(e)
{
	if ( e.TargetInstance.State != e.PreviousInstance.State ) {
		WScript.Echo('****');
		WScript.Echo(new Date());
		WScript.Echo(e.TargetInstance.DisplayName);
		WScript.Echo('Current state: ' + e.TargetInstance.State);
		WScript.Echo('Previous state: ' + e.PreviousInstance.State);
	}
};

WScript.Echo('**** Waiting for asynchronous event...');

while ( 1 ) {
    WScript.Sleep(1000);
}


Предлагаемые Deferred и Promise решения выглядят красивыми, но громоздкими. Гораздо проще были бы решения вроде предложенной x-yuri.

Последний раз редактировалось with-love-from-siberia, 31.10.2011 в 07:02.
Ответить с цитированием