Я пытаюсь перебрать кучу данных и сделать асинхронные вызовы. Однако я не понимаю синтаксис правильно
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 раз. Как сделать запрос айснч для каждого запроса?
Вы должны использовать 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
Была еще одна переменная, которую вы не объявили (поэтому она была глобальной): dictionary
. Я обновил ответ. Это то, на что стоит обратить внимание. Никогда не начинайте использовать переменные, не объявив их. Используйте "use strict"
, чтобы сделать это обязательной привычкой.
Я обновил словарь, чтобы он стал const
, но похоже, что он все еще пытается использовать последний идентификатор при каждом вызове выборки. Хороший призыв к соглашениям об именах!
Пожалуйста, отладьте, чтобы проверить, что такое conversationId
, сразу после var conversationId =
. Если там всегда одно и то же, проблема в коде вашего сервера.
да, я думаю, что что-то не так! делать это сейчас.
На самом деле я не захожу на свой сервер, я захожу на сервер обмена, пытающийся получить некоторые данные электронной почты.
Хорошо, но в любом случае, если вы действительно снова и снова получаете один и тот же идентификатор из ответа fetch
, то это действительно выходит за рамки вашего вопроса.
Кстати, что такое aysynch
, что вы переходите на fetch
? Если это всегда одно и то же, разве это не нормально, что вы каждый раз получаете один и тот же ответ?
похоже, это то, что происходит! спасибо, что помогли мне отладить это. Ваш ответ остается прежним, он помог мне кое-что, что мне пришлось бы выяснить :-)
Я обновлю свой вопрос, чтобы показать, что происходит. Я понятия не имею, почему это происходит.
добавил результаты ... есть мысли о том, почему он может застрять на первом идентификаторе? Я скопировал вызов fetch в другое окно и искал этот идентификатор, просто чтобы убедиться, что он не был жестко запрограммирован где-либо там.
fml, я понял это, соглашение об именах.... Я добавил conversationID
в конкатенацию строк, а не conversationId
и conversationID
был сохранен как эта одна строка...
Хорошо, теперь я думаю, что вам следует удалить изменения из своего вопроса, так как он сгибает вопрос в сторону этой совершенно другой проблемы и использует код из ответов, из-за чего ответы выглядят неуместными.
Сделаю! Спасибо! Кстати, я могу отправить вам DM?
Давайте продолжить обсуждение в чате.
это имеет смысл. Все еще сталкиваюсь с проблемой использования одного и того же идентификатора каждый раз. Я обновил свой вопрос, чтобы показать результаты вашего ответа