Работа с async для каждого элемента массива с использованием модуля async.js в nodejs - PullRequest
0 голосов
/ 29 ноября 2018

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

Нет ли способа сделать это без добавления setTimeout?Я нахожу это странным.Перепробовал все из модуля async / await, обещания, обратного вызова, async.js. Как справиться с чем-то подобным на практике?

Вот что я пытаюсь сделать

let reseach = { }
        let drinktypes = ["1", "2", "3", "4"];

        async.eachSeries( 
            drinktypes, 
            async item => {
              console.log( 'item:', item )
              let query = ` SELECT us.*, 
            fl.web_path, 
            pr.product_name, 
            pr.acidity, 
            pr.drink_type, 
            pr.recmd, 
            pr.raw_ingredient, 
            pr.milling,
            pr.label_image as li,
            fl2.web_path AS wp, 
            pr.alcohol, 
            pr.sake_index, 
            pr.kouboname, 
            pr.kojiname, 
            pr.product_details, 
            pr.memo, 
            pr.type_name, 
            pr.code AS code, 
            pr.raw_ingredient, 
            pr.milling, 
            mk.brewery_name, 
            mk.prefecture 
     FROM   users_scores us 
            join products pr 
              ON us.product_id = pr.pid
            LEFT JOIN fileslabels fl2 ON pr.label_image = fl2.id
            join makers mk 
              ON pr.brewery = mk.mid 
            join product_label pl 
              ON pr.pid = pl.product_id 
            join files fl 
              ON pl.file_id = fl.id 
     WHERE  user_id =\"${req.body.userid}\" 
            AND dranktimes <> 0
            AND pr.drink_type = \"${item}\"`;

            connection.query(query, function (error, results ,fields) {
                    if(!error) {
                    reseach[item] = results[0];

                    } else {
                    throw error;
                    }
                });

              Promise.resolve() // <-- instead of callback
            }, 
            err => {
              console.log('err:', err)
              console.log(reseach) // null 

            setTimeout(function(){ 
                console.log("timeout", reseach); //works
             }, 100);

            }
          )

1 Ответ

0 голосов
/ 29 ноября 2018

Если я правильно понял ваш вопрос, то вы можете просто сделать это одним SQL-запросом (например, этот запрос короткий):

let query = 'SELECT name FROM users WHERE drink_type IN (?)';
connection.query(query, drinktypes);

Использование this

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...