Перебор списка вызовов fetch()

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

async function getEmailData(conversationId){
    fetch(aysynch)
    .then(response => {return response.json(); })
    .then(data => {
        dictionary = {}
        console.info(data)
        var info = data.Body.ResponseMessages.Items[0].Conversation.ConversationNodes[0].Items[0]
        console.info(info)
        var conversationId = info.ConversationId.Id
        var from = info.From.Mailbox.EmailAddress
        var to = info.ToRecipients.map(function(recipient) {return recipient.EmailAddress})
        var date = info.DateTimeReceived
        dictionary[conversationId] = {'from':from, 'to': to, 'date': date}
        return dictionary
    })
}

x = [listOfIds] //10 in total

for (i=0; i<x.length; i++) {
    console.info(x[i].ConversationId.Id)
    let response = await getEmailData(x[i].ConversationId.Id)
    let data = await response
    console.info(data)
}

Это распечатка всех идентификаторов, а затем получение идентификатора списка в x и запуск его 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) для оценки ваших знаний,...
0
0
112
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы должны использовать let. Вы объявляете глобальную переменную i.

for (let i = 0; i < x.length; i++) {
    console.info(x[i].ConversationId.Id)
    let response = await getEmailData(x[i].ConversationId.Id)
    let data = await response
    console.info(data)
} 
Ответ принят как подходящий

Некоторые вопросы:

  • Функция getEmailData ничего не возвращает. Вам нужно return результат цепочки обещаний.
  • async не имеет смысла, если вы не используете await внутри такой функции
  • await вне функции async недопустимо.
  • await response бесполезно, когда response уже является результатом await
  • объявите свои переменные (с let, var, const)

Итак, сделайте следующее:

function getEmailData(conversationId){
    return fetch(aysynch)
    .then(response => response.json())
    .then(data => {
        const dictionary = {};
        console.info(data);
        var info = data.Body.ResponseMessages.Items[0].Conversation.ConversationNodes[0].Items[0];
        console.info(info);
        var conversationId = info.ConversationId.Id;
        var from = info.From.Mailbox.EmailAddress;
        var to = info.ToRecipients.map(recipient => recipient.EmailAddress);
        var date = info.DateTimeReceived;
        dictionary[conversationId] = {from, to, date};
        return dictionary;
    });
}

(async function() {
    let x = [1, 2, 4, 6, 9, 13, 23, 22, 24, 19]; //10 in total

    for (let i=0; i<x.length; i++) {
        console.info(x[i].ConversationId.Id);
        let data = await getEmailData(x[i].ConversationId.Id);
        console.info(data);
    }
})(); // Immediately invoked

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

Morgan Allen 07.04.2019 21:42

Была еще одна переменная, которую вы не объявили (поэтому она была глобальной): dictionary. Я обновил ответ. Это то, на что стоит обратить внимание. Никогда не начинайте использовать переменные, не объявив их. Используйте "use strict", чтобы сделать это обязательной привычкой.

trincot 07.04.2019 21:51

Я обновил словарь, чтобы он стал const, но похоже, что он все еще пытается использовать последний идентификатор при каждом вызове выборки. Хороший призыв к соглашениям об именах!

Morgan Allen 07.04.2019 21:52

Пожалуйста, отладьте, чтобы проверить, что такое conversationId, сразу после var conversationId = . Если там всегда одно и то же, проблема в коде вашего сервера.

trincot 07.04.2019 21:53

да, я думаю, что что-то не так! делать это сейчас.

Morgan Allen 07.04.2019 21:55

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

Morgan Allen 07.04.2019 21:56

Хорошо, но в любом случае, если вы действительно снова и снова получаете один и тот же идентификатор из ответа fetch, то это действительно выходит за рамки вашего вопроса.

trincot 07.04.2019 21:57

Кстати, что такое aysynch, что вы переходите на fetch? Если это всегда одно и то же, разве это не нормально, что вы каждый раз получаете один и тот же ответ?

trincot 07.04.2019 21:58

похоже, это то, что происходит! спасибо, что помогли мне отладить это. Ваш ответ остается прежним, он помог мне кое-что, что мне пришлось бы выяснить :-)

Morgan Allen 07.04.2019 22:00

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

Morgan Allen 07.04.2019 22:06

добавил результаты ... есть мысли о том, почему он может застрять на первом идентификаторе? Я скопировал вызов fetch в другое окно и искал этот идентификатор, просто чтобы убедиться, что он не был жестко запрограммирован где-либо там.

Morgan Allen 07.04.2019 22:13

fml, я понял это, соглашение об именах.... Я добавил conversationID в конкатенацию строк, а не conversationId и conversationID был сохранен как эта одна строка...

Morgan Allen 07.04.2019 22:18

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

trincot 07.04.2019 22:20

Сделаю! Спасибо! Кстати, я могу отправить вам DM?

Morgan Allen 07.04.2019 22:34

Давайте продолжить обсуждение в чате.

trincot 07.04.2019 22:38

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