Мне нужно вызвать несколько конечных точек с каждым вызовом в зависимости от результатов предыдущего вызова.
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'
})
Он может стать вполне вложенным. Есть ли способ сгладить это, возможно, используя генераторы?
Обещаны для выравнивания:
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
});
Сжимайте цепи обещаний, возвращаясь, когда у вас есть новое обещание. Однако, когда у вас есть значение без обещаний, не делайте этого. Это просто отходы микрозадания. Просто используйте значение напрямую:
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))
Я не знаю, что есть отличное решение, чтобы избежать строки 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()