1. 3 г. назад

    Господа, делитесь. Надо в js организовать возврат некого html-документа функцией. Формирование занимает некоторое время, если власть результат в return, то оно сначала вернёт undefined, а потом завершит формирование документа. Клятая асинхронность налагает специфику, так сказать.
    В кои-то веки решил попользовать конструкцию async - await, а мне нода ругается: говорит, что unexpected token function.

    async function res(){
    	let t = await make_report();
    	console.log(t);
    }
    

    Это как такое делать принято у белых людей?

    Ответы: (1) (16)
  2. (0) Нахрена ты из асинхронной функции пытаешься сделать синхронную? Все преимущества теряются. Используй лучше коллбек или промис.

    Ответы: (2)
  3. (1) там задача сугубо линейная: сформировать таблицу из базы данных. Там асинхронность не нужна. Но ты мне, дурню, всё-таки расскажи: что за промис такой?
    ЗЫ: в C# вот всё было по-людски, линейно :)
    В крайнем случае - потоки подключить можно, на ручном управлении... А тут - понавыдумывали анафемы какой-то...

    Ответы: (3) (4) (13)
  4. Дуб что за промис такой?

    Те же яйца что и коллбек, только с другим синтаксисом. Особо не заморачивайся

  5. Дуб Там асинхронность не нужна.

    Тогда что за асинхронная функция make_report? Ты ее писал? Если она у тебя возвращает undefined, то ты не сможешь применить к ней await .

  6. промис функция, которая после успешного исполнения вызовет твою функцию и передаст ей результат.
    Либо в случае исключения вызовет другую твою функцию и отдаст ей ошибку.

  7. Вот мой говнокод:

    function make_report(){
    	Firebird.attach(options, function(err, db) {
    	 
    		if (err)
    			throw err;
    		
    		let current_date = new Date();
    		current_date.setDate(current_date.getDate() - 1);
    		
    		let user_list_text = '';
    		
    		let user_list = [];
    		if(user_list.length > 0){
    			
    			user_list.forEach(function(item, i, arr) {
    				user_list_text += item + ',';
    			});
    			user_list_text = ' and STAFF.ID_STAFF IN (' + user_list_text.substring(0, user_list_text.length - 1) + ') ';
    		}
    		
    		let firm_list_text = '';
    		let firm_list = []; //7494
    		if(firm_list.length > 0){
    			
    			firm_list.forEach(function(item, i, arr) {
    				firm_list_text += item + ',';
    			});
    			firm_list_text = ' and REG_EVENTS.SUBDIV_ID IN (' + firm_list_text.substring(0, firm_list_text.length - 1) + ') ';
    			//console.log(firm_list_text);
    		}
    		
    		let q_text = querry_text();
    		q_text = q_text.replace('@user_list_text', user_list_text);
    		q_text = q_text.replace('@firm_list_text', firm_list_text);
    		
    		db.query(q_text, [current_date], function(err, result) {
    			if(err){
    				console.log(err);
    				db.detach();
    				return err;
    			}
    			else{
    				let htm = open_htm;
    				htm += '<table cellspacing="0" border="1" cellpadding="0" width="100%">';
    				let pre_time = '';
    				let pre_usr = '';
    				let c_name = '';
    				
    				result.forEach(function(item, i, arr) {
    					if(item.STAFF_ID != null && pre_usr == item.STAFF_ID.toString() && pre_time == item.TIME_EVENT.toString()){
    						c_name += item.FIRM.toString();
    					}
    					else{
    						htm += '<tr>';
    						htm += '<td db_date="' + date_from_date(item.DATE_EVENT) + '">' + time_from_date(item.TIME_EVENT) + '</td>';
    						htm += '<td db_id="' + item.AREA_ID + '">' + item.AREA + '</td>';
    						htm += '<td db_id="' + item.STAFF_ID + '">' + item.STAFF + '</td>';
    						htm += '<td db_id="' + item.FIRMV_ID + '">' + item.FIRM + '</td>';
    						htm += '</tr>';
    						c_name = '';
    					}
    					pre_usr = item.STAFF_ID.toString();
    					pre_time = item.TIME_EVENT.toString();
    				});
    				htm += '</table>';
    				htm += close_htm;
    				/*fs.writeFile('D:/firebird/report.htm', htm, (err) => {if(err){console.error(err); return}});*/
    				//console.log(htm);
    				db.detach();
    				return htm;
    			}
    		});
    	});
    }
    
    Ответы: (9) (29)
  8. Вот там, где комментил запись в файл, там работало корректно. А если ретурн делать, то фигу.

  9. Это для node.js ?

  10. (6) там где сейчас return, там то же все коректно. А вот return из make_report там да - результата еще нет. Ну, и это правильно и хорошо.

  11. 04.06.2020 09:19:18 отредактировано sda553

    1. Сделай параметр в make_report
    make_report(onDataReady){...}

    2. Там где return htm сейчас вызови onDataReady(htm)

    3. Не получай и не ожидай результуту от самого метода make_report, а передавай в нее в качестве параметра onDataReady метод, который и будет делать то что надо с подготовленным результатом запроса

    Ответы: (12) (18)
  12. 04.06.2020 09:23:45 отредактировано sda553

    .....;
    make_report(function(htm) {
    //ура в этом месте результат готов и не пустой, делаем что надо
    //с результатом запроса
    ....;
    });
    // а вот тут результат не определен может быть
    ...;

  13. (10) шайтанама...

  14. Дуб там задача сугубо линейная

    Дуб, забудь про линейность, не в бэйсике, чать

    Ответы: (14)
  15. (13) у меня 3/4 кода - в "линейных" средах. Я не могу забыть :)

  16. Миллениалы изобретают колбэк?

  17. Дуб Господа, делитесь. Надо в js организовать возврат некого html-документа функцией. Формирование занимает некоторое время, если власть результат в return, то оно сначала вернёт undefined, а потом завершит формирование документа. Клятая асинхронность налагает специфику, так сказать.
    В кои-то веки решил попользовать конструкцию async - await, а мне нода ругается: говорит, что unexpected token function.

    async function res(){
    	let t = await make_report();
    	console.log(t);
    }
    

    Это как такое делать принято у белых людей?

    У белых людей сначала учат js, а потом его ругают

    У тебя make report промис возвращает? Нет.

    Ответы: (17)
  18. stackoverflow У белых людей сначала учат js, а потом его ругают

    Нет времени учить! Учить - потом будем, когда дело сделаем :)

  19. Вот именно поэтому люди ненавидят жо эс. Не учат, но ненавидят.

    В (10) верное решение. Твоя библиотечка не поддерживает промисы

    Ответы: (19)
  20. (18) кто это ненавидит?! Лично я - просто обожаю :)
    Спасибо. Бум делать.

  21. я лично ноду обожаю

    Ответы: (23)
  22. 04.06.2020 16:07:43 отредактировано jsmith82

    мне нравится это язык изза его динамичности. пишешь как рожаешь. вообще полёт мысли

    Ответы: (23) (35)
  23. чел мэн ган пишет на хабре. я ваабще зачитываюсьь им

  24. (20)(21) Node это не язык

  25. оу. а что такое нода

    Ответы: (27)
  26. https://habr.com/ru/users/fillpackart/posts/

  27. афигенно пишет

  28. jsmith82 оу. а что такое нода

    Поцанчег, тебя жабаскриптеры [...] за такие вопросы.

  29. ну ты мозги не [...] во-первыъ

  30. Дуб Вот мой говнокод:

    function make_report(){
    	Firebird.attach(options, function(err, db) {
    	 
    		if (err)
    			throw err;
    		
    		let current_date = new Date();
    		current_date.setDate(current_date.getDate() - 1);
    		
    		let user_list_text = '';
    		
    		let user_list = [];
    		if(user_list.length > 0){
    			
    			user_list.forEach(function(item, i, arr) {
    				user_list_text += item + ',';
    			});
    			user_list_text = ' and STAFF.ID_STAFF IN (' + user_list_text.substring(0, user_list_text.length - 1) + ') ';
    		}
    		
    		let firm_list_text = '';
    		let firm_list = []; //7494
    		if(firm_list.length > 0){
    			
    			firm_list.forEach(function(item, i, arr) {
    				firm_list_text += item + ',';
    			});
    			firm_list_text = ' and REG_EVENTS.SUBDIV_ID IN (' + firm_list_text.substring(0, firm_list_text.length - 1) + ') ';
    			//console.log(firm_list_text);
    		}
    		
    		let q_text = querry_text();
    		q_text = q_text.replace('@user_list_text', user_list_text);
    		q_text = q_text.replace('@firm_list_text', firm_list_text);
    		
    		db.query(q_text, [current_date], function(err, result) {
    			if(err){
    				console.log(err);
    				db.detach();
    				return err;
    			}
    			else{
    				let htm = open_htm;
    				htm += '<table cellspacing="0" border="1" cellpadding="0" width="100%">';
    				let pre_time = '';
    				let pre_usr = '';
    				let c_name = '';
    				
    				result.forEach(function(item, i, arr) {
    					if(item.STAFF_ID != null && pre_usr == item.STAFF_ID.toString() && pre_time == item.TIME_EVENT.toString()){
    						c_name += item.FIRM.toString();
    					}
    					else{
    						htm += '<tr>';
    						htm += '<td db_date="' + date_from_date(item.DATE_EVENT) + '">' + time_from_date(item.TIME_EVENT) + '</td>';
    						htm += '<td db_id="' + item.AREA_ID + '">' + item.AREA + '</td>';
    						htm += '<td db_id="' + item.STAFF_ID + '">' + item.STAFF + '</td>';
    						htm += '<td db_id="' + item.FIRMV_ID + '">' + item.FIRM + '</td>';
    						htm += '</tr>';
    						c_name = '';
    					}
    					pre_usr = item.STAFF_ID.toString();
    					pre_time = item.TIME_EVENT.toString();
    				});
    				htm += '</table>';
    				htm += close_htm;
    				/*fs.writeFile('D:/firebird/report.htm', htm, (err) => {if(err){console.error(err); return}});*/
    				//console.log(htm);
    				db.detach();
    				return htm;
    			}
    		});
    	});
    }
    

    У тебя эта функция ничего не возвращает. Оберни ее в промис, или внутри ее сделай промис вот так, и вместо return используй resolve, тогда можно будет делать как ты хотел, через await.

    function make_report(){
        return new Promise((resolve, reject) => {
            Firebird.attach(options, function(err, db) {
    
                if (err)
                    throw err;
    
                let current_date = new Date();
                current_date.setDate(current_date.getDate() - 1);
    
                let user_list_text = '';
    
                let user_list = [];
                if(user_list.length > 0){
    
                    user_list.forEach(function(item, i, arr) {
                        user_list_text += item + ',';
                    });
                    user_list_text = ' and STAFF.ID_STAFF IN (' + user_list_text.substring(0, user_list_text.length - 1) + ') ';
                }
    
                let firm_list_text = '';
                let firm_list = []; //7494
                if(firm_list.length > 0){
    
                    firm_list.forEach(function(item, i, arr) {
                        firm_list_text += item + ',';
                    });
                    firm_list_text = ' and REG_EVENTS.SUBDIV_ID IN (' + firm_list_text.substring(0, firm_list_text.length - 1) + ') ';
                    //console.log(firm_list_text);
                }
    
                let q_text = querry_text();
                q_text = q_text.replace('@user_list_text', user_list_text);
                q_text = q_text.replace('@firm_list_text', firm_list_text);
    
                db.query(q_text, [current_date], function(err, result) {
                    if(err){
                        console.log(err);
                        db.detach();
                        reject(err);
                    }
                    else{
                        let htm = open_htm;
                        htm += '<table cellspacing="0" border="1" cellpadding="0" width="100%">';
                        let pre_time = '';
                        let pre_usr = '';
                        let c_name = '';
    
                        result.forEach(function(item, i, arr) {
                            if(item.STAFF_ID != null && pre_usr == item.STAFF_ID.toString() && pre_time == item.TIME_EVENT.toString()){
                                c_name += item.FIRM.toString();
                            }
                            else{
                                htm += '<tr>';
                                htm += '<td db_date="' + date_from_date(item.DATE_EVENT) + '">' + time_from_date(item.TIME_EVENT) + '</td>';
                                htm += '<td db_id="' + item.AREA_ID + '">' + item.AREA + '</td>';
                                htm += '<td db_id="' + item.STAFF_ID + '">' + item.STAFF + '</td>';
                                htm += '<td db_id="' + item.FIRMV_ID + '">' + item.FIRM + '</td>';
                                htm += '</tr>';
                                c_name = '';
                            }
                            pre_usr = item.STAFF_ID.toString();
                            pre_time = item.TIME_EVENT.toString();
                        });
                        htm += '</table>';
                        htm += close_htm;
                        /*fs.writeFile('D:/firebird/report.htm', htm, (err) => {if(err){console.error(err); return}});*/
                        //console.log(htm);
                        db.detach();
                        resolve(htm);
                    }
                });
            });
        });
    }
  31. Второй вариант, при вызове делать так:

    let t = await new Promise(resolve => make_report(resolve));

    И внутри функции make_report так же вместо return htm использовать resolve(htm) как и в примере выше

  32. 04.06.2020 17:01:31 отредактировано webdev

    Еще можно сделать через Deferred, но это не очень хороший вариант, грязноватый.

  33. Четвертый вариант, обойтись вообще без промисов:
    В make_report добавить параметр resolve, как и во втором примере:

    function make_report(resolve) {
    

    и так же вызывать resolve(htm) вместо return htm

    Саму функцию вызывать через такую конструкцию:

    await { then: make_report };
  34. Спасибо, товарищи. Аллах да наградит вас за отзывчивость и доброту :)
    ЗЫ: всё-таки мышление под JS надо перестраивать. Квадратно-гнездовым одноэсным способом тут не везде терпимо…

    Ответы: (34) (36)
  35. Дуб Спасибо, товарищи. Аллах да наградит вас за отзывчивость и доброту :)
    ЗЫ: всё-таки мышление под JS надо перестраивать. Квадратно-гнездовым одноэсным способом тут не везде терпимо…

    Как в итоге решил проблему?

    Ответы: (40)
  36. jsmith82 пишешь как рожаешь.

  37. Дуб Квадратно-гнездовым одноэсным способом тут не везде терпимо…

    ты когда форум напишешь, мудак. всё свои асинки на ноде любишь хвалить. рассуждать об этом

  38. gimme invite

  39. Интересно, как адын эснеги на скала будут пейсать

    Ответы: (39)
  40. (38) ничего интересного.

  41. (34) вставкой параметра resolve с последующим resolve(htm) вместо return htm и конструкцией make_report(function(htm){}) в вызове функции. Не я решил - вы мне тут наподсказали :) Я такой схемы раньше не встречал, так что ещё раз спасибо.

    Ответы: (41)
  42. Дуб и конструкцией make_report(function(htm){}) в вызове функции

    Это тебе вроде никто не советовал. Мне кажется так await не будет работать. Ты на коллбек переделал чтоли?

    Ответы: (42)
  43. (41) см. выше :)
    ЧСХ - оно бы работало и в нормальном исполнении, с return, если бы вызывать её без обёртки изначально. По крайней мере - в складской базе у меня так нормально работало. И в спортивной. Но мне упёрлось сделать именно так :)
    Ещё раз спасибо.

    Ответы: (43)
  44. Дуб ЧСХ

    Чё это?

    Ответы: (44)
  45. (43) то же что и ИЧСХ, только без И

  46. Блтъ ..

или зарегистрируйтесь чтобы ответить!