Обертывание функции циклом айч с промисом

Я новичок в 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, но не знаю, как написать его, чтобы он перебирал все перед разрешением.

TotalConversationsInView из Exchange, соответственно отредактируйте свой пост и теги
zer00ne 07.04.2019 18:42
Поведение ключевого слова "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
1
40
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Я не знаю, поможет ли это.

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
Morgan Allen 07.04.2019 19:44

Хорошо... позвольте мне исправить это.

Andrew Eisenberg 08.04.2019 01:58

Добавлен ответ с использованием async/await. Я также могу добавить чистый ответ Promises, если хотите, но этот ответ намного чище.

Andrew Eisenberg 08.04.2019 02:14

Спасибо! сегодня потратил массу времени на изучение/практику выполнения асинхронных вызовов. Это помогло мне понять их.

Morgan Allen 08.04.2019 02:31

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