1

Тема: VBS: как дождаться завершения функции?

Доброго времени суток, уважаемые!
Вопрос состоит в следующем: необходимо поочерёдно выполнить несколько функций так, чтобы сначала выполнилась 1-я и только затем 2-я, функций может быть много.
На данный момент столкнулся с такой проблемой, что запускаются сразу все функции, не дожидаясь завершения предыдущей.
Если кто решал подобную задачу, прошу отписаться.

Пример кода для наглядности:

Function Func1()
...
End Function

Function Func2()
...
End Function

Function Func3()
...
End Function

Do
  Func1()
  Func2()
  Func3()
Loop
Кодинг, как много в этом слове...

2

Re: VBS: как дождаться завершения функции?

Не воспроизводится. Приведите конкретный пример, воспроизводящий проблему.

3 (изменено: pad0nak, 2012-02-15 10:11:23)

Re: VBS: как дождаться завершения функции?

Пример (закинул в HTA):

<html>
  <head>
    <TITLE>Title</TITLE>
    <META http-equiv=Content-Type content="text/html; charset=windows-1251"/>
    <script language="VBScript">
      Function main()
        sleep 1,"1"
        sleep 5,"5"
        sleep 3,"3"
      End function
      Function sleep(sTime,text)
        If (sTime > 0) Then
          sTime = sTime - 1
          setTimeOut "sleep "&sTime&","&text,1000
        Else
          document.getElementById("log").innerHtml = document.getElementById("log").innerHtml & "[" & cstr(time()) & "] " & text & "<br>"
        End If
      End Function
    </script>
  </head>
  <body onLoad="VBScript: main()">
    <div id="log"></div>
  </body>
</html>

Хотелось бы чтоб вевел в порядке 1,5,3, как и задано, а выводит 1,3,5 (значит стартуют одновременно)

Кодинг, как много в этом слове...

4

Re: VBS: как дождаться завершения функции?

Т.к функция setTimeout псевдоасинхронная, то приходится работать с колбэками.


<html>
	<head>
		<title>Title</title>
		<meta http-equiv=Content-Type content="text/html; charset=windows-1251"/>
		<script language="VBScript">
		
		Dim i
		
		Sub window_onload()
			SelectWaiter
		End Sub
		
		Sub SelectWaiter()
			Select Case i
			Case 0
				WriteLog "Ставим таймаут секунду."
				Wait 1000, "Wait_complete()"
			Case 1
				WriteLog "Ставим таймаут 5 секунд."
				Wait 5000, "Wait_complete()"
			Case 2
				WriteLog "Ставим таймаут 3 секунды."
				Wait 3000, "Wait_complete()"
			Case 3
				WriteLog "Конец !"
			End Select
		End Sub
		
		Sub Wait(Timeout,callback)
			setTimeout callback, timeout
		End Sub
		
		Sub Wait_complete()
			i = i + 1
			SelectWaiter()
		End Sub
		
		Sub WriteLog(Text)
			logDiv.innerHtml = logDiv.innerHtml & Text & "<br>"
		End Sub
		</script>
	</head>
	<body>
		<div id="logDiv"></div>
	</body>
</html>
Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !

5

Re: VBS: как дождаться завершения функции?

Как альтернатива, для HTA можно использовать такой вариант:


<html>
    <head>
        <meta charset="windows-1251">
    </head>
    <body>
        <script language="vbscript">
        Sub window_onload()
            WriteLn "Ждём секунду."
            Sleep 1000

            WriteLn "Ждём 5 секунд."
            Sleep 5000
            
            WriteLn "Ждём 3 секунды."
            Sleep 3000
            
            WriteLn "Конец"
        End Sub

        Sub WriteLn(Text)
            document.body.innerHtml = document.body.innerHtml & Text & "<br>"
        End Sub

        Sub Sleep(ByVal mSec)
            CreateObject("WScript.Shell").Run "ping 0.0.0.0 -w " & Clng(mSec), 0, True
        End Sub
        </script>
    </body>
</html>
Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !