Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 31.05.2018, 12:23
Аватар для arahmanov
Профессор
Отправить личное сообщение для arahmanov Посмотреть профиль Найти все сообщения от arahmanov
 
Регистрация: 26.01.2011
Сообщений: 197

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....

как сразу ошибка
Ответить с цитированием
  #2 (permalink)  
Старый 31.05.2018, 15:27
Аватар для Alexandroppolus
Профессор
Отправить личное сообщение для Alexandroppolus Посмотреть профиль Найти все сообщения от Alexandroppolus
 
Регистрация: 25.10.2016
Сообщений: 1,005

набросок
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());
  });
Ответить с цитированием
  #3 (permalink)  
Старый 31.05.2018, 15:41
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,492

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

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

Последний раз редактировалось Aetae, 31.05.2018 в 15:43.
Ответить с цитированием
  #4 (permalink)  
Старый 31.05.2018, 15:53
Аватар для Alexandroppolus
Профессор
Отправить личное сообщение для Alexandroppolus Посмотреть профиль Найти все сообщения от Alexandroppolus
 
Регистрация: 25.10.2016
Сообщений: 1,005

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

хотя хрен знает, из обрывков кода ничего не понятно...
Ответить с цитированием
  #5 (permalink)  
Старый 31.05.2018, 17:34
Аватар для arahmanov
Профессор
Отправить личное сообщение для arahmanov Посмотреть профиль Найти все сообщения от arahmanov
 
Регистрация: 26.01.2011
Сообщений: 197

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

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

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

Прочитал кучу макулатуры и очень многие советуют перестать думать асинхронно.
Но как ??
Если в бд одна таблица с ключами по которым надо выбрать из другой, проверить и выбрать из третей ...
5 лет с php - сломайте меня полностью
Ответить с цитированием
  #6 (permalink)  
Старый 31.05.2018, 17:44
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,492

Вообще просто стройте sql запросы по-сложней. Большинство задач решается одним запросом и тогда не надо заморачиваться.)
__________________
29375, 35
Ответить с цитированием
  #7 (permalink)  
Старый 31.05.2018, 18:01
Аватар для arahmanov
Профессор
Отправить личное сообщение для arahmanov Посмотреть профиль Найти все сообщения от arahmanov
 
Регистрация: 26.01.2011
Сообщений: 197

Сообщение от Aetae Посмотреть сообщение
Вообще просто стройте sql запросы по-сложней. Большинство задач решается одним запросом и тогда не надо заморачиваться.)
Спасибо! попробую усложнить
Ответить с цитированием
  #8 (permalink)  
Старый 01.06.2018, 17:38
Аватар для arahmanov
Профессор
Отправить личное сообщение для arahmanov Посмотреть профиль Найти все сообщения от arahmanov
 
Регистрация: 26.01.2011
Сообщений: 197

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

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

Благодарю!
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Порядок выполнения функций с Promise и без. Даниленко Денис Общие вопросы Javascript 0 29.04.2017 12:33
Как асинхронно вызвать resolve() вне Promise? Malleys Общие вопросы Javascript 8 18.12.2016 08:00
Node.js + mysql mazahist Node.JS 4 17.11.2016 19:07
Концептуальная разница connection и pool модуля mysql andryxx Node.JS 2 17.03.2016 13:33
NODE.js и MySQL проверка. 715kg AJAX и COMET 0 11.10.2015 19:02