Цитата:
Сообщение от wizardpnz
|
Насчет Promise ничего не могу сказать - старался избегать их.
А по поводу того вопроса такое решение может помочь:
Код:
var funcResult;
Firebird.attach(options, function(err, db) {
if (err)
throw err;
db.query('select * from MATERIAL', function(err, result) {
funcResult = result;
db.detach();
});
});
НО: и attach и query - асинхронные функции, которые выполняются "в фоне", и когда они выполнятся - неизвестно, поэтому это решение "грязное", ибо может породить кучу ошибок (большая вероятность того, что если в следующей после attach строке будет обращение к funcResult, то его еще не успеют присвоить). Результат (result) лучше всего обрабатывать там, где он пришел (в функции, которая является параметром функции query).
И еще: в обработчиках событий асинхронность уже не работает. Вот простой пример:
Код:
var b = Action.Properties.NewBool('b');
b.OnValueChange = ()=>{
require('timers').setTimeout(function (msg){
alert(msg);
}, 1000, 'hello, world!');
}
require('timers').setTimeout(function (msg){
alert(msg);
}, 3000, 'hello, world!');
// alert(345);
Action.Continue();
По коду:
1. Создается булевое свойство.
2. Ему назначается обработчик в котором таймер: через секунду алертом вывести сообщение.
3. В основном теле таймер: через 3 секунды алертом вывести сообщение (примечание - на эти 3 секунды Базис виснет, но скрипт работу продолжает.)
4. Если раскомментарить алерт, то при выполнении скрипта можно увидеть, что 3 секунды таймера отсчитываются асинхронно "в фоне", а скрипт продолжает работу и вызывает алерт.
5. Вызов Action.Continue(), чтобы скрипт продолжил работать дальше.
По итогам:
1. Таймер в основном цикле отрабатывает.
2. Если у булевого свойства поменять значение, то таймер уже не сработает.
Отсюда вывод, что асинхронные функции работают только в основном теле скрипта. Но даже там они могут представлять опасность обычному пользователю. Вот
потенциально опасный скрипт:
Код:
require('timers').setInterval(function (msg){
alert(msg);
}, 3000, 'hello, world!');
Этот код запускает не одноразовый таймер, а интервал - то есть, алерт будет каждые три секунды после окончания предыдущего интервала. Проблема Базиса в том, что он ждет окончания всех асинхронных функций, а интервал будет идти бесконечно, и такое же время будет висеть Базис. И запустив такой скрипт, завершить его можно лишь вырубив процесс Базиса.