Вызов нескольких API без особых вложений

1

Мне нужно вызвать несколько конечных точек с каждым вызовом в зависимости от результатов предыдущего вызова.

return http.get('url1')
  .then(response1 => {
     return response1.data
  })
  .then(data => {
    http.get('url2' + data) 
      .then(response2 => {
        return response2.data 
      }) // etc ... until the 'nth url'
  })

Он может стать вполне вложенным. Есть ли способ сгладить это, возможно, используя генераторы?

Теги:
ecmascript-6
promise

3 ответа

2
Лучший ответ

Обещаны для выравнивания:

return http.get('url1').then(response1 => {
     return response1.data
  }).then(data => {
     return http.get('url2' + data);
  }).then(response2 => {
     return http.get('url3' + response2.data);
  }) // ...etc

Если ваш механизм JavaScript поддерживает async/await, это может быть сокращено и доступно для чтения в рамках функции async:

async function demo() {
    const response1 = await http.get('url1');
    const response2 = await http.get('url2' + response1.data);
    const response3 = await http.get('url3' + response2.data);
    // ...
    return responseN;
}

... и затем назовите это:

demo().then(response => {
    console.log(response);
    // ...etc
});
  • 0
    Отлично, спасибо @trincot
  • 1
    Если ваша среда / настройка поддерживает это, вы можете еще больше сгладить этот код, используя синтаксис async / await: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
0

Сжимайте цепи обещаний, возвращаясь, когда у вас есть новое обещание. Однако, когда у вас есть значение без обещаний, не делайте этого. Это просто отходы микрозадания. Просто используйте значение напрямую:

return http.get('url1')
  .then(response => http.get('url2' + response.data)) 
  .then(response => doSomethingWith(response.data))

Чтобы получить простое имя переменной data, вместо этого используйте деструктурирование:

return http.get('url1')
  .then(({data}) => http.get('url2' + data)) 
  .then(({data}) => doSomethingWith(data))
0

Я не знаю, что есть отличное решение, чтобы избежать строки then(), но нет необходимости в гнезде:

return http.get('url1')
.then(response1 => response1.data)
.then(data => http.get('url2' + data))
.then(response2 => response2.data ) 
// etc ... until the 'nth url'

Если шаблон одинаковый в каждом случае, вы можете передать список URL-адресов и использовать reduce()

Ещё вопросы

Сообщество Overcoder
Наверх
Меню