Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > JavaScript, Ajax
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 31.01.2019, 02:21   #1
Parallelogram
Недотепа
Форумчанин
 
Регистрация: 18.01.2011
Сообщений: 174
По умолчанию Promise, как дождаться выполнения

Здравствуйте.
Есть код, у меня вместо setTimeout идет запись в indexedDB, но это не должно менять суть вещей.
Код:
console.clear();
function myPromise(val) {
  return new Promise(function(resolve, reject) {
    setTimeout(() => {
      resolve("--res"+val);
    }, val);
  });
}

function F1(){ console.log('1'); }
function F4(){ console.log('4'); }

let arr1 = {1:1, 2:2};
let arr2 = [1,2,3,4,5];

F1();
for (let key in arr1) {
  console.log('-2');
  arr2.forEach(function(item){
    myPromise(100+item)
      .then(function(res) {
        console.log(res);
      });
    console.log('--3');
  });
}
F4();
Сейчас выводится так:
1
-2
--3
--3
--3
--3
--3
-2
--3
--3
--3
--3
--3
4
--res101
--res101
--res102
--res102
--res103
--res103
--res104
--res104
--res105
--res105

Как сделать так, чтобы все выполнялось синхронно?
Вывод должен быть такой:
1
-2
--res101
--3
--res102
--3
--res103
--3
--res104
--3
--res105
--3
-2
--res101
--3
--res102
--3
--res103
--3
--res104
--3
--res105
--3
4
Parallelogram вне форума Ответить с цитированием
Старый 31.01.2019, 07:52   #2
Parallelogram
Недотепа
Форумчанин
 
Регистрация: 18.01.2011
Сообщений: 174
По умолчанию

Написал велосипед, но он работает только с одной итерацией цикла for-in. Если arr1 = {1:1, 2:2}, то runNextTask() выполняется асинхронно.
Код:
console.clear();

let arr1 = {1:1};
let arr2 = [1,2,3,4,5];
var cnt;
var memory = 1;



function myPromise(val) {
  return new Promise(function(resolve, reject) {
    setTimeout(() => {
      resolve("--res"+val);
    }, val);
  });
}

function F1(){ console.log('1'); }
function F4(){ console.log('4'); }



function loop() {
  for (let key in arr1) {
    console.log('-2');
    cnt = arr2.length;
    runNextTask();
  }
}


function runNextTask(){
  if(cnt-- > 0) {
    arr2.forEach(function(item, i){
      if (i != cnt) { return; }
      myPromise(1000+item)
        .then(function(res) {
        console.log(res);
        console.log('--3');
        runNextTask();
      });
    });
  }
}


F1();
loop();
F4();
Parallelogram вне форума Ответить с цитированием
Старый 31.01.2019, 13:16   #3
Naive
Раздолбайских Дел
Старожил
 
Аватар для Naive
 
Регистрация: 22.05.2009
Сообщений: 3,828
По умолчанию

Честно удивлен, что у промисов нет своего ватерфолла... Впрочем, они уже не в моде =D

Смотри в сторону функций-генераторов.
Alar, верни репу!
Naive вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Хранилище Promise NS4300N SergPromise Компьютерное железо 0 26.03.2013 09:09
Как циклу дождаться выполнения процедуры bakanaev Общие вопросы Delphi 9 03.08.2012 16:45
Как дождаться завершения запущенного приложения DennerV Win Api 5 13.08.2010 13:48
Как дождаться завершения процедуры? Hintman Win Api 6 14.10.2009 14:46
Как запустить приложение, дождаться его исполнения и только потом выполнять код? il76 Win Api 6 19.07.2007 14:00