ES6 Promises.all() не выполняет все (в промисах нет ошибок)

Я пытаюсь создать массив обещаний, которые будут выводить сообщение на консоль при выполнении. Однако кажется, что он печатается только один раз, хотя в массиве есть 10 объектов обещаний.

Я пробовал решение в Обещания ES6/вызов функции после выполнения нескольких обещаний (нельзя использовать Promises.all) но это все еще не работает.

function fillArrayWithPromise(promise, numTimes) {
  let promiseArr = Array(numTimes).fill(promise);
  console.info(promiseArr.join("-"));
  return promiseArr
}

var sendStuffB = new Promise(
  function(resolve, reject) {
    try {
      console.info("submitted one req");
    } catch (error) {
      console.info("Error: " + error);
    }
  }
)

let testA = fillArrayWithPromise(sendStuffB, 10);

Promise.all(
  testA.map(promise => Promise.resolve(promise).catch(err => console.info(error)))
).then(function() {
  console.info("End");
});

Я ожидал, что консоль будет печатать 10 раз «Один объект отправлен», но он печатается на консоли только один раз и после этого продолжает работать бесконечно долго.

Вот журнал ошибок: Запуск тестового сценария... Один объект отправлен отправлен один запрос [object Promise]-[object Promise]-[object Promise]-[object Promise]-[object Promise]-[object Promise]-[object Promise]-[object Promise]-[object Promise]-[object Promise]

"но это выводится на консоль только один раз" — Потому что в вашем сценарии есть только один настоящий Promise. promise в fillArrayWithPromise является ссылкой на sendStuffB, поэтому вы заканчиваетесь массивом numTimes копий этой ссылки, но не копиями упомянутого Promise
Andreas 20.06.2019 10:03

NB: Совершенно бесполезно копировать один и тот же объект обещания в массив.

trincot 20.06.2019 10:08

Здесь две ошибки: вы не разрешаете обещание, и у вас есть одно и то же обещание (которое будет выполнено только один раз) 10 раз.

Iván Pérez 20.06.2019 10:10
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
3
3
114
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Вы не вызываете функцию разрешения в промисах, поэтому они никогда не завершатся. Попробуйте сделать это:

var sendStuffB = new Promise(
  function(resolve, reject) {
    try {
      console.info("submitted one req");
      resolve();
    } catch (error) {
      console.info("Error: " + error);
      reject(error);
    }
  }
)

@Andreas - когда функция была вызвана при создании обещания. Обратите внимание, что функция никогда не завершается, а не никогда не звонят

slebetman 20.06.2019 10:10

@Tom не разрешается, поэтому End не печатается. Это не должно влиять submitted one req

Ayush Gupta 20.06.2019 10:13

@AyushGupta, вы правы, есть только одно обещание, которое ожидается 10 раз (в отличие от создания 10 отдельных обещаний, как в вашем ответе, что, вероятно, и было желаемым)

Tom Holmes 20.06.2019 10:18

@Andreas Promise.resolve создает новое обещание, которое немедленно преобразуется в значение, которое вы передаете, однако, когда это значение является обещанием, оно ожидает разрешения этого обещания и возвращает его значение разрешения. Это не заставляет переданное обещание разрешиться, но ждет его.

Tom Holmes 20.06.2019 10:20
Ответ принят как подходящий

Потому что sendStuffB — это только одно обещание, поэтому оно разрешается только один раз. Все остальные элементы в вашем массиве являются ссылками на одно и то же разрешенное обещание.

Вместо этого в функции fillArrayWithPromise передайте функцию, которая возвращает обещание, и вызовите эту функцию отдельно для каждого элемента массива.

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

function fillArrayWithPromise(promiseFn, numTimes) {
  let promiseArr = Array(numTimes).fill(promiseFn).map(fn => fn()); //see this
  return promiseArr
}

var sendStuffB = () => new Promise(  // converted to function
  function(resolve, reject) {
    try {
      console.info("submitted one req");
      resolve(); // remember to resolve
    } catch (error) {
      console.info("Error: " + error);
      reject(error); // reject
    }
  }
)

let testA = fillArrayWithPromise(sendStuffB, 10);

Promise.all(
  testA.map(promise => Promise.resolve(promise).catch(err => console.info(error)))
).then(function() {
  console.info("End");
});

@Андреас Андреас, нет, Promise.resolve(promise) в этом случае сводится к невыполненному обещанию.

Ayush Gupta 20.06.2019 10:21

Как видно по Promise.resolve(new Promise(() => {})).then(console.info)

Ayush Gupta 20.06.2019 10:21

Это базовый пример функциональности Promise.all.

Это может помочь вам.

const delayArray = [1000,1500,2000];

const promises = delayArray.map((item) => {
  return new Promise((resolve,reject) => {
    setTimeout(()=>{
      console.info('I was resolved in' + item + 'ms');
      resolve('Resolved' + item + 'ms');
    },item);
  });
});

Promise.all(promises)
.then((values) => console.info(values));

Другие вопросы по теме