о, теперь ясно
если хотите неасинхронно, то получите тормоза интерфейса (заморозку на время скрытия), зато код будет исполняться, как у вас в последнем варианте.
если хотите плавности (скрывается за секунду и в это время можно потыкать и пошевелить мышей), то пишите код асинхронным
// ваш пример
var Dlg = function () {
this.onClose = function () {};
this.show = function () {};
this.doClose = function () { this.onClose(1) }
};
var dlg = new Dlg();
dlg.show();
var test; // тут будет строка
dlg.onClose = function (e) {
if (e != 0) {
test = "error"; // строка предназначена для test
/* ... тут дальше манипулируем с test ... */
}
}
dlg.doClose();
а это синхронный пример
var Dlg = function () {
this.onClose = function () {};
this.show = function () {};
this.doClose = function () {
while( this.visible ) {
/* скрываем */
if( /*почти скрыт*/ ) break;
}
this.onClose(1);
}
}
var test = function() {
var dlg = new Dlg();
dlg.show();
var str;
dlg.onClose = function (e) {
if (e != 0) {
str = "error"; // строка предназначена для test
}
}
dlg.doClose();
// т.к. у нас синхронность выполнения, можно написать так
return str;
}
var result = test();
синхронность выполняет бесконечный цикл внутри
doClose, который потом прервётся.
на практике асинхронный способ даст плавность и интерактивность, а синхронный замирание на время скрытия