我在JavaScript和承诺相当新手。 我试图建立我从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的家伙)。
让我知道如果我的问题不够清楚。 我一直在抓我的头两天,感觉就像我在圈我跑。
感谢您成为一个真棒社区!