@gelosoft
Frontend-developer

Как вызывать несколько одинаковых промисов синхронно подряд до выполнения условия внутри промиса?

Есть обращение к стороннему api, к примеру, шлю GET api/?name=bla-bal&last_id=
В ответ получаю массив объектов [{id: <идентификатор элемента>}, ..., {id: <идентификатор элемента>}]. Количество элементов произвольно в каждом ответе.
Первый вызов идет без last_id, последующие с id последнего элемента последней выборки.
Идет подсчет кол-ва полученных объектов и как только получено нужное кол-во остановить обращения к api.
Как это сделать?
  • Вопрос задан
  • 354 просмотра
Решения вопроса 1
bingo347
@bingo347 Куратор тега JavaScript
Crazy on performance...
//Ваша функция запроса, я же просто посчитаю рандомы для примера
//Значение аргумента по умолчанию подставил для 1-ого случая, у Вас же может быть проверка
function someAsync(cur = 1){
  return Promise.resolve(cur * Math.random());
}

//Функция раннер, которая будет асинхронно-рекурсивно перевызываться
function run(next){
  return someAsync(next).then(result => {
    if(result < 0.1) { //Некое условие, что последний результат получен
      return result;
    }
    return run(result); //Перезапуск
  });
}

run().then(result => console.log('Последний результат:', result));
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@vshvydky
1 - async await (node 7 --harmony или babel)
async function go(){
    let p1 = await promise1(...);
    let p2 = await promise2(p1);
    let p3 = await promise3(p2);
    return p3;
}
go().then(response=>{
    console.log(response); // <= p3
}).catch(console.error);

2. Можно использовать модуль vo (там есть режим последовательной отработки промисов, менее удобно.
3. Писать нечто такое:
promise1
    .then(response1=>{
        return promise2(response1);
    })
     .then(response2=>{
        return promise3(response2);
    })
     .then(response3=>{
        console.log(response3) // <=ваш результат
    })
    .catch(console.error);


Естественно все функции promise1, promise2, promise3 это такого рода функции:
const promise =  (params) => new Promise((resolve, reject) => { ..... какой - то код });
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы