javascript asyn c функция выборки - PullRequest
0 голосов
/ 05 августа 2020

Я пытаюсь создать рекурсивную функцию, которая отправляет запрос PUT для каждого целого числа данного массива и вызывает другую функцию в его конце.

function fetchArchive(arr,state,mailbox){
  if(arr.length == 0){
    load_mailbox(mailbox)
  }
  for(i of arr){
    fetch(`/emails/${arr.shift()}`, {
      method: 'PUT',
      body: JSON.stringify({
          archived: state
      })
    })
    .then(fetchArchive(arr,state,mailbox))
  }
}

Но кажется, что она вызывает load_mailbox() перед выборкой последнего элемента массива. Я знаю, что это лучше реализовать с помощью async / await. Может ли кто-нибудь привести пример этого, чтобы помочь мне понять?

ОБНОВЛЕНИЕ: оказывается, что приведенный ниже код работает

async function fetchArchive(a,s,callback){
  for(i of a){
    await fetch(`/emails/${i}`, {
      method: 'PUT',
      body: JSON.stringify({
          archived: s
      })
    })
    // if i is the last item, load mailbox
    .then(() => { if(i==a[a.length-1] && callback) callback()});
  }
}

1 Ответ

1 голос
/ 05 августа 2020

Это правильный код для asyn c for..of l oop

async function fetchArchive(arr,state,mailbox){
    console.log(1)
  if(arr.length === 0){
    load_mailbox(mailbox)
  }
    
  for await (const elem of arr){
    await fetch2(elem);
        arr.shift();

        console.log({ elem })

    fetchArchive(arr,state,mailbox)
  }
}

Однако этот код не работает и вызывает бесконечную рекурсию :) Я думаю, что это плохая идея. изменить массив внутри итерации. Также имейте в виду, что then получает обратный вызов. Итак, аргумент propper для then:

.then(response=>fetchArchive(respone))

В вашем случае вы не можете передать fetchArchive в качестве аргумента методу then, потому что fetchArchive не возвращает функцию

[ОБНОВЛЕНИЕ]

Это рабочий код со сравнением индексов массива:

const fetchArchive = async (a, s, callback) => {
  for (const [index, value] of a.entries()) {
    await fetch(index)
      // if i is the last item, load mailbox
      .then(() => {
        if (index == a.length - 1 && callback) {
          callback();
        }
      });
  }
};

Документация по entries Вы можете найти здесь

...