Javascript forEach в массиве внутри обещания

В моей функции javascript я могу вызвать службу отдыха внутри обещания.

function update(item) {
  return new Promise(function (resolve, reject) {
    client.get(urls[env] + item['itemId'], function (data, response) {
        try {......

Теперь, когда я изменяю ту же функцию для обработки массива элементов, как:

function update(itemList) {
  return new Promise(function (resolve, reject) {
    itemList.forEach((item) =>{
        client.get(urls[env] + item['itemId'], function (data, response) {
            try {

Это не работает. Призыв к отдыху просто не происходит. Это тоже не подводит.

Что мне здесь не хватает?

Вы на 100% уверены, что массив не пуст?

ps-aux 02.06.2018 14:10

Я печатаю его размер и могу видеть значения внутри него во время отладки ... так что, конечно, у него есть элементы.

Mandroid 02.06.2018 14:11

Тогда, возможно, вам стоит поделиться полным кодом и выводом.

ps-aux 02.06.2018 14:14

Не помещайте цикл forEach внутрь исполнителя new Promise. Поместите туда только асинхронный вызов.

Bergi 02.06.2018 14:32

Значит, вы имеете в виду, что асинхронный вызов внутри Promise вообще не работает? Любая причина, по которой это происходит. Я относительно новичок в JS, отсюда и эти проблемы.

Mandroid 02.06.2018 14:37
Поведение ключевого слова "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) для оценки ваших знаний,...
0
5
460
2

Ответы 2

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

Следующий код показывает, как это сделать, я использую ES5, но предполагаю собственные промисы или полифил:

function promiseClientGet(o, url){
  return new Promise(function(resolve,reject){
    o.get(url, function (data, response) {
      // try {...... need to call resolve or reject
    });
  });
}

function update(itemList) {
  return Promise.all(itemList.map(function(item) {
    return promiseClientGet(urls[env] + item['itemId'], client);
  }))
}

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

const promiseClientGet = (o, url) => new Promise((resolve,reject)=> {
  o.get.apply(o, (data, response) => {
    // try {...... need to call resolve or reject
  });
});

const update = itemList =>
  Promise.all(itemList.map(item => promiseClientGet(urls[env] + item['itemId'], client)));

Если вы просто хотите делать параллельные запросы и ждать, пока все они закончатся и вернут результаты, вы можете использовать Promise.all()

const getAll = (items) =>
    Promise.all(items.map(i => callApi(i)))

getAll([1, 2, 3])
    .then(results => console.info(results))

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