Асинхронное программирование - реализация функции для "синхронизации"
В 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. Попробовал рекурсией, но, как я понимаю, количество вызовов функции превысило максимум (проверял, рекурсия работает). Ваши идеи? |
JS - однопоточный язык. Функция wait не ждёт, а хавает ресурсы, причём нагло.
Шанс того, что получится переделать асинхронную операцию в синхронную, в однопоточном приложении, не более чем нулевой. Обычно это решается делением на потоки. |
Ясно...
|
А поподробнее?
|
ф-ии вида:
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ий аргумент и будет являться колбэком |
То есть просто запуск функции после окончания работы другой? Это мне не поможет.
|
Тоже так подумал, но как запихнуть это в 1 функцию?
|
var folder = /* объект папки */; alert(CheckingForFile(folder, "file.txt")); // Выведет true или false Вот как проверку с "сетинтервалами" вставить в функцию CheckingForFile? |
Да всё это бесполезно. Нужно останавливать функцию пока "колбаки", "сетинтервалы" и т. д. не сделают своё дело.
|
| Часовой пояс GMT +3, время: 19:17. |