Я новичок в Javascript и все еще думаю о написании обещаний.
function addToList(data) {
conversationList = data.Body.Conversations
console.info(conversationList)
for (i=0; i<conversationList.length; i++) {
fullInbox.push(conversationList[i])
}
console.info(fullInbox.length)
}
var fullInbox = []
var maxLenReturn = 200
var offset = 0
function fetchData(offset){
fetch(asynchCall)
.then(response=>{return response.json()})
.then(data=>{
var fullLength = data.Body.TotalConversationsInView
console.info(fullLength)
addToList(data)
if (offset < fullLength-maxLenReturn) {
offset+= maxLenReturn
fetchData(offset)
}
})
}
fetchData(offset)
// trying to make something like this work
.then( .... console.info(fullInbox.length))
У меня есть цикл внутри функции fetchData
, и я хочу обернуть его обещанием, чтобы, когда это будет сделано, я мог распечатать fullInbox
var promise1 = new Promise(function(resolve, reject) {
var fullInbox = []
var maxLenReturn = 200
var offset = 0
fetchData(offset);
resolve(fullInbox)
});
promise1.then(function(value) {
console.info('promise resolved')
console.info(value);
});
Я думаю, что мне нужно resolve
внутри fetchData
, но не знаю, как написать его, чтобы он перебирал все перед разрешением.
Я не знаю, поможет ли это.
var promise1 = new Promise(function(resolve, reject) {
var fullInbox = [];
var maxLenReturn = 200;
var offset = 150;
for(let i = offset; i < maxLenReturn; i++) {
fullInbox.push(i);
}
resolve(fullInbox);
}).then(value => console.info(value));
Из того, что я вижу в вашем коде, ваша функция addToList
является синхронной, поэтому ей не нужно ничего делать с промисами. Но в следующий раз, когда вы позвоните fetchData
, вам нужно выполнить обещание. Итак, что-то вроде этого будет работать:
function fetchData(offset){
return fetch(asynchCall)
.then(response=>{return response.json()})
.then(data=>{
var fullLength = data.Body.TotalConversationsInView
console.info(fullLength)
addToList(data)
let promise;
if (offset < fullLength-maxLenReturn) {
offset+= maxLenReturn
promise = fetchData(offset)
} else {
promise = Promise.resolve();
}
return promise;
})
}
И если вы хотите использовать Синтаксис стиля async/await, все становится намного приятнее читать:
async function fetchData(offset){
let response = await fetch(asynchCall)
let data = await response.json();
let fullLength = data.Body.TotalConversationsInView
console.info(fullLength)
addToList(data)
if (offset < fullLength-maxLenReturn) {
offset+= maxLenReturn
await fetchData(offset)
}
}
Async/await поддерживается во всех основных современных браузерах, и вы можете использовать полифилл для более старых браузеров. Из-за более чистого синтаксиса я настоятельно рекомендую использовать его. Это убережет вас от написания ошибок.
Итак, вот более короткая версия, делающая то, что вам нужно. Он использует async/await. И каждый вызов fetchData
возвращает элементы папки «Входящие» со смещения, которое было передано до конца. Использование параметров по умолчанию позволяет избежать использования глобальных переменных.
async function fetchData(offset = 0, maxLenReturn = 200) {
let response = await fetch(asyncCall)
let data = await response.json();
let inbox = data.Body.Conversations;
let fullLength = data.Body.TotalConversationsInView
if (offset < fullLength-maxLenReturn) {
offset+= maxLenReturn
inbox.push(...await fetchData(offset))
}
return inbox;
}
let fullInbox = fetchData()
fetchData(offset).then(response=>{console.info(response})
возвращается пустым, как мне вернуть fullInbox
Хорошо... позвольте мне исправить это.
Добавлен ответ с использованием async/await. Я также могу добавить чистый ответ Promises, если хотите, но этот ответ намного чище.
Спасибо! сегодня потратил массу времени на изучение/практику выполнения асинхронных вызовов. Это помогло мне понять их.
TotalConversationsInView
из Exchange, соответственно отредактируйте свой пост и теги