Вход

Просмотр полной версии : Асинхронное программирование - реализация функции для "синхронизации"


function
13.06.2012, 13:53
В Windows 8 мне понадобилась функция для проверки существования файла. Таковой разработчиками не введено, пришлось написать самому.

var ret;
var aux_var;

function wait(variable) {

if (variable) {

return true;

} else {

return wait(variable);

}

}

//-------------------------------------------------------------

function CheckingForFile(folder, file) {

ret = false;
aux_var = 0;

folder.getItemsAsync().then(function (items) {

items.forEach(function (item) {

if (item.name == file) {

ret = true;

}

});

aux_var = 1;

});

wait(aux_var);

return ret;

}

В фунцию CheckingForFile(folder, file) передаётся специальный объект папки и название файла. По идее она дожна возвращать true, если в папке есть файл, а иначе false. Функция getItemsAsync() получает все элементы, находящиеся в папке, в качестве массива. then(func) назначает фунцию, которая запускается при окончании получения массива файлов. Мне нужно задерживать окончание функции до того, как закончится выполнение функции func. Попробовал рекурсией, но, как я понимаю, количество вызовов функции превысило максимум (проверял, рекурсия работает). Ваши идеи?

melky
13.06.2012, 15:07
JS - однопоточный язык. Функция wait не ждёт, а хавает ресурсы, причём нагло.

Шанс того, что получится переделать асинхронную операцию в синхронную, в однопоточном приложении, не более чем нулевой.

Обычно это решается делением на потоки.

function
13.06.2012, 15:13
Ясно...

function
14.06.2012, 10:05
А поподробнее?

9xakep
14.06.2012, 10:27
ф-ии вида:

var obj = {
text: 'some text'
}
function func1(callback) {
callback.apply(obj)
}
func1(function () { alert(this.text) })


Хотя это что-то не то...

Ну вот допустим ты сделал ф-ию для отправки ajax запросов
ajax('post','page.php', function ( data ) { alert (data) }) // data - это ответ от сервера

Вот 3ий аргумент и будет являться колбэком

function
14.06.2012, 22:11
То есть просто запуск функции после окончания работы другой? Это мне не поможет.

function
18.06.2012, 13:51
Тоже так подумал, но как запихнуть это в 1 функцию?

function
21.06.2012, 16:10
var folder = /* объект папки */;

alert(CheckingForFile(folder, "file.txt")); // Выведет true или false



Вот как проверку с "сетинтервалами" вставить в функцию CheckingForFile?

function
22.06.2012, 13:52
Да всё это бесполезно. Нужно останавливать функцию пока "колбаки", "сетинтервалы" и т. д. не сделают своё дело.