Причина, по которой await
изменил ситуацию, заключается в том, что любой await
будет ожидать хотя бы микротрубу - независимо от того, является ли ожидаемое вами значение Future
или нет. Если это Future
, он будет ждать его завершения или выполнения микрозадачи, если она уже завершена. Он будет вести себя идентично, если бы вы await null;
следовали за controller.add(2);
.
В общем случае StreamController
не знает, когда все слушатели получили событие, особенно учитывая такие вещи, как асинхронные слушатели или Stream.asyncMap
.
При использовании Kernel.system () метод, он возвратит булевскую переменную, указывающую на успех команды.
result = system("cp -r dir1 dir2")
if(result)
#do the next thing
else
# handle the error
Существует хорошее сравнение различных рубиновых системных команд здесь.
Как Вы выполняете внешние команды? Ruby system()
функциональные возвраты true
или false
в зависимости от того, была ли команда успешна. Кроме того, $?
содержит ошибочное состояние.
exec
'd управляют потому что exec
заменяет текущую программу exec
'd команда, таким образом, команда никогда не возвращалась бы к Ruby для проверки.$?
предварительно определенная переменная даст Вам код возврата последней команды, которая будет выполняться system()
или оператор обратной галочки.Для обновления SVN проверьте номер версии прежде и после обновления.
svn_start_version = IO.popen("svn info").readlines[4]
`svn update`
svn_end_version = IO.popen("svn info").readlines[4]
if svn_end_version > svn_start_version
"success"
end
Для CP Вы могли сделать, размер файла проверяет исходный файл, являющийся равным скопированному файлу.
source_file_size = IO.popen("du file1").readlines
`cp file1 file2`
dest_file_size = IO.popen("du file2").readlines
if dest_file_size == source_file_size
"success"
end