Promise не выполняется последовательно

Я использую пакет из npm для очистки метаданных с URL-адреса с именем метаданные URL. то, что я пытаюсь сделать, это просмотреть список ссылок json и очистить метаданные от каждой ссылки.

код

    doc.edited_feed.items.forEach(item => {
        // get metadata of each item link 
        urlMetadata(item.link).then(metadata => {
        // add new item to the feed with the scraped metadata.image
      console.info("running urlmetadata function")
        feed1.addItem({
          title: item.title,
          link: url,
          description: item.contentSnippet,
          content: item.content,
          id: item.link,
          date: new Date(item.isoDate),
          image: metadata.image
        });
        });


      }
    }); // End Foreach


    console.info("after foreach block");
    response.type("application/xml");
    response.send(feed1.rss2());

Проблема в том, что функция metadataurl запускается после отправки ответа

выход

    After foreach block
running urlmetadata function
running urlmetadata function
running urlmetadata function

что прямо противоположно тому, что я написал я предполагаю, что это как-то связано с асинхронной функцией или обещанием

Любая помощь, пожалуйста:/?

Ваша догадка (почти) верна. Функция urlMetadata НЕ ЗАПУСКАЕТСЯ после отправки ответа, а завершается после отправки ответа. Это связано с асинхронным характером вызова функции. Решение: поместите response.send() в часть обещания .then().

devnull69 04.07.2019 15:49

Если я помещу туда response.send(), он соскребет метаданные первой ссылки, а не всех остальных ссылок.

Az Emna 04.07.2019 15:51

Правильно, вы должны перейти по ссылке, упомянутой @ponury-kostek, и изменить forEach на цикл for или for-of.

devnull69 04.07.2019 16:13
Поведение ключевого слова "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
3
60
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Создайте асинхронную функцию и ожидайте каждого ответа в цикле for

const funcName = async (items) => {
    for (let i = 0; i < items.length; i++) {
        let metadata = await urlMetadata(item.link);
        // do stuff with metadata
    }
}

Как минимум, Promise — это объект с методом then, который принимает функцию обратного вызова для работы с возвращаемым конечным значением. ...

Я рекомендую вам использовать синхронную выборку для вашей ситуации

Обещание работает как гонка между разрешением/отклонением и затем. Он отслеживает собственное состояние выполнения закрытия, зная, находится ли оно в ожидании, разрешено или отклонено.

(async () => {
      try {
        console.info("Start");

        for (let index = 0; index < doc.edited_feed.items.length; index++) {
          const item = doc.edited_feed.items[index];
          const metadata = await urlMetadata(item.link);
          feed1.addItem({
            title: item.title,
            link: url,
            description: item.contentSnippet,
            content: item.content,
            id: url,
            date: new Date(item.isoDate),
            image: metadata.image
          });
          console.info(metadata.image, "hellooooooooo");
        }
        response.type("application/xml");
        response.send(feed1.rss2());

        console.info("End");
      } catch (e) {
        console.info(e);
      }
    })();

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