这个线程详细解释了同步和异步之间的区别以及可能的解决方案,但我已经在使用其中一种解决方案&仍然出错。我想我已经达到了
async fetch({store, error}) {
let series = '', courses = [], album = {}
store.state.courses.forEach(async course => {
album = {...course}
series = course.uri.split('/')[2]
try {
const {data: {data}} = await axios.get('http://localhost:3000/luvlyapi/videos', {
params: {
series //? album id
}
})
album['videos'] = data
courses.push(album)
console.log('loop', courses)
} catch (err) {
error({statusCode: err.statusCode, message: err})
}
})
console.log({courses})
store.commit('SET_COURSES', courses)
您可以看到数组正在被推入,但循环结束后仍然是空的。
值得理解的是,
重要的是要理解
另一方面,
例如,您可以这样做:
async fetch({store, error}) {
let series = '', courses = [], album = {};
for (let course of store.state.courses) {
album = {...course}
series = course.uri.split('/')[2]
try {
const {data: {data}} = await axios.get('http://localhost:3000/luvlyapi/videos', {
params: {
series //? album id
}
})
album['videos'] = data
courses.push(album)
console.log('loop', courses)
} catch (err) {
error({
statusCode: err.statusCode,
message: err
})
}
}
console.log({courses})
store.commit('SET_COURSES', courses)
}
仅供参考,您的原始实现还存在一个问题,即在多个异步回调中共享更高级的作用域变量,这些变量同时运行,这将导致一个变量在另一个变量上跳转。解决方案是,要么像我的代码示例所示那样,序列化异步调用,这样它们就不会同时运行,要么将变量声明为异步作用域的本地变量,这样每个异步回调都有自己的独立变量。
尝试如下使用Promise.all(从head编写代码)
null
async fetch({ store, error }) {
let series = '', courses = [], album = {}
let pr = store.state.courses.map(course => {
return new Promise(resolve => {
album = { ...course }
series = course.uri.split('/')[2]
try {
const { data: { data } } = await axios.get('http://localhost:3000/luvlyapi/videos', {
params: {
series //? album id
}
})
album['videos'] = data
courses.push(album)
console.log('loop', courses)
resolve();
} catch (err) {
error({ statusCode: err.statusCode, message: err })
}
})
});
await Promise.all(pr);
console.log({ courses })
store.commit('SET_COURSES', courses)
}