Тема интересная. Что-то подобное уже обсуждалось в другой ветке на форуме. К сожалению все это по большей части "завязано" на браузерную среду либо "тянет" за собой целый ворох полезных, но не всегда нужных методов. Например, в среде 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.