Я новичок в JavaScript и в Promises.Я пытаюсь создать массив объектов, которые я получаю из API.
Для этого я построил две функции в файле MyFile.js
.
Первая возвращаетобещание, когда обещание аксиоса разрешено.Это
function get_items (url) {
return new Promise((resolve, reject) => {
let options = {
baseURL: url,
method: 'get'
}
axios(options)
.then(response => {
resolve(response.data)
})
.catch(error => {
reject(error.stack)
})
})
}
Второй выглядит так:
let output = []
let next_url = 'https://some_url.com/api/data'
async function get_data () {
try {
let promise = new Promise((resolve, reject) => {
if (next_url) {
get_items(next_url)
.then(response => {
output.push(...response.results)
if (response.next) {
next_url = response.next
console.log('NEXT_URL HERE', next_url)
get_data()
} else {
console.log('else')
next_url = false
get_data()
}
})
.catch(error => {
reject(error.stack)
})
} else {
console.log('before resolve')
resolve(output)
}
})
return await promise
} catch(e) {
console.log(e)
}
}
Это то место, где я скриплю зубами.Мне кажется, что я понимаю эту функцию:
- она возвращает значение обещания (это то, что я понимаю,
return await promise
делает) - это рекурсивная функция.Итак, если есть next_url, функция продолжается.Но если его нет, его в последний раз вызывают для перехода в часть
else
, где он разрешает массив output
, который содержит результаты (значения, а не состояние) всех обещаний.По крайней мере, когда я выполняю его и проверяю мои проверки работоспособности с помощью console.log
, который я написал, он работает.
Итак, output
заполнен данными, и это здорово.
Но когда я вызываю эту функцию из другого файла MyOtherFile.js
, например:
final_output = []
MyFile.get_data()
.then(result => {
console.log('getting data')
final_output.push(...result)
})
, она никогда не попадает в часть then
.А когда я console.log MyFile.get_data()
, это ожидающее обещание.
Итак, я хотел бы заставить get_data()
ждать всех результатов обещаний (без использования Promise.all() иметь вызовы в серии, а не параллельно, что было бы замечательно для производительности, я полагаю?) и затем иметь возможность получить этот ответ в части then
при вызове этой функции из любого другого места.Имейте в виду, что я новичок в обещаниях и JavaScript в целом (я скорее парень из Python).
Дайте мне знать, если мой вопрос недостаточно ясен.Я уже два дня чешу голову, и мне кажется, что я бегаю по кругу.
Спасибо за то, что вы классное сообщество!