Javascript-форум (https://javascript.ru/forum/)
-   Node.JS (https://javascript.ru/forum/node-js-io-js/)
-   -   promise-mysql (https://javascript.ru/forum/node-js-io-js/73952-promise-mysql.html)

arahmanov 31.05.2018 12:23

promise-mysql
 
Доброго времени суток.
Пробую понять принц работы промисов.
Все вроде просто, дождался и пошел дальше, но как быть с циклами ?

вот пример

var result = connection.query("SELECT * FROM form_ok  WHERE  id_form = '"+id_form+"'" );
return result;
}).then(function(rows){
				var numbers_form_ok = rows.length;
				for (var i = 0; i < numbers_form_ok; i++) {
					var k=0;
 				  id_variant = rows[i].id_variant;


// первый запрос с ним все хорошо

var result =connection.query("SELECT * FROM form_variant WHERE id= '"+id_variant+"'");
result.then(function(rows){



// тут второй запрос в этом же цикле
стоит мне написать
connection.query("SELECT * FROM....

как сразу ошибка

Alexandroppolus 31.05.2018 15:27

набросок
var result = connection.query("SELECT * FROM form_ok  WHERE  id_form = '"+id_form+"'" )
  .then(function(rows){
    return rows.reduce(function (p, row) {
      return p.then(connection.query.bind(connection, "SELECT * FROM form_variant WHERE id= '" + row.id_variant + "'"))
        .then(function(rowsVariant) {
          // тут что-то делаем с rowsVariant
        }, function () {
          // обработка ошибки для запроса из form_variant
        });
    }, Promise.resolve());
  });

Aetae 31.05.2018 15:41

Для массивов использовать Promise.all.
Никаких циклов с промисами. Промисы - те же коллбэки в симпатичной обёртке. Никакой магии они не делают, и то что делать было нельзя до промисов(например ожидание удалённого ответа в цикое) - нельзя и с промисами.

В цикле можно использовать await промиса. Нативный await, который уже отдельная языковая конструкция, и может делать то, что не может чистый промис.

Alexandroppolus 31.05.2018 15:53

Цитата:

Сообщение от Aetae
Promise.all

похоже там ошибка из-за двух одновременных запросов.

хотя хрен знает, из обрывков кода ничего не понятно...

arahmanov 31.05.2018 17:34

Цитата:

Сообщение от Aetae (Сообщение 486417)
Для массивов использовать Promise.all.
Никаких циклов с промисами. Промисы - те же коллбэки в симпатичной обёртке. Никакой магии они не делают, и то что делать было нельзя до промисов(например ожидание удалённого ответа в цикое) - нельзя и с промисами.

В цикле можно использовать await промиса. Нативный await, который уже отдельная языковая конструкция, и может делать то, что не может чистый промис.


Promise.all - ВЕЩЬ!
сейчас попробую собрать отдельно массивы и избавиться от циклов.
Если не будет получиться буду пробовать вешать await

Прочитал кучу макулатуры и очень многие советуют перестать думать асинхронно.
Но как ??
Если в бд одна таблица с ключами по которым надо выбрать из другой, проверить и выбрать из третей ...
5 лет с php - сломайте меня полностью :haha:

Aetae 31.05.2018 17:44

Вообще просто стройте sql запросы по-сложней. Большинство задач решается одним запросом и тогда не надо заморачиваться.)

arahmanov 31.05.2018 18:01

Цитата:

Сообщение от Aetae (Сообщение 486435)
Вообще просто стройте sql запросы по-сложней. Большинство задач решается одним запросом и тогда не надо заморачиваться.)

Спасибо! попробую усложнить

arahmanov 01.06.2018 17:38

Всем Большое спасибо!

Разобрался с промис.олл
Но в итоге реально усложнил сам запрос в sql итог две строки вместо кучи ожиданий.

Благодарю!


Часовой пояс GMT +3, время: 09:39.