【发布时间】:2019-10-08 09:54:59
【问题描述】:
我有一个来自 Spotify 的 JSON 文件,其中包含代表艺术家的对象。在这些对象内部,其中一个属性是“流派”,它是一个字符串数组(流派)。
我想做的是在 MongoDB 中找到或创建这些类型。然后将这些对象 ID 添加到一个数组中,并在我创建 Artist 对象时传递该数组。
但是,我的艺术家是在为他们的流派找到或创建过程完成之前以 DB 方式创建的。
因此 fillRest 行在 fillGenres 之前运行。
我尝试从 Object.values.forEach 更改为 for..of、for..in、不同的异步、promise、修改代码...
基本上我可以在任何地方添加等待(可能大多数在错误的地方)
import * as data from '../spotify_data/artist_id.json';
async function fillGenres(array) {
const genreIDs = []; // array of genre object IDs I'm trying to put inside every appropriate artist
if (array !== 'undefined') {
for (const element of array) {
await Genre.findOrCreate({ name: element }, (err, result) => {
genreIDs.push(result._id);
});
}
}
return genreIDs;
}
async function fillRest(entry, genreIDs) {
const artist = {
name: entry.ArtistName,
genres: genreIDs,
spotifyID: entry.ArtistID,
popularity: entry.Popularity,
spotifyFollowers: entry.Followers,
};
Artist.create([artist])
.then((result) => {
console.log(result);
})
.catch((error) => {
console.log(error);
});
}
async function spotifySeed() {
const entries = Object.values(data);
for (const entry of entries) {
fillGenres(entry.Genres)
.then((genreIDs) => {
fillRest(entry, genreIDs); // this line gets executed before fillGenres above^ which is super weird
});
}
}
spotifySeed();
艺术家被添加到 MongoDB,流派设置为 []。 之后,我得到带有良好genreID数组的控制台输出(应该在里面^而不是流派)。
已解决 - 编辑
感谢所有提供帮助的人。问题出在 findOrCreate 中,因为它没有返回承诺。我将这个包用于猫鼬而不是具有 Promises (https://www.npmjs.com/package/mongoose-findorcreate)。
现在的代码是
if (Array.isArray(array)) {
// eslint-disable-next-line no-restricted-syntax
for (const element of array) {
await Genre.findOrCreate({ name: element })
.then((result) => {
genreIDs.push(result.doc._id);
});
}
}
在 SpotifySeed 中
const genreIDs = await fillGenres(entry.Genres);
await fillRest(entry, genreIDs);
【问题讨论】:
标签: javascript asynchronous mongoose ecmascript-6 promise