gpt4 book ai didi

javascript - .then 中的代码在 Promise 之前执行

转载 作者:行者123 更新时间:2023-11-29 10:01:28 24 4
gpt4 key购买 nike

我有一个来自 Spotify 的 JSON 文件,其中包含代表艺术家的对象。在这些对象内部,其中一个属性是“流派”,它是一个字符串数组(流派)。

我正在尝试做的是在 MongoDB 中查找或创建这些流派。然后将这些对象 ID 添加到一个数组中,并在我创建艺术家对象时传递该数组。

但是,我的艺术家是在为他们的流派找到或创建过程完成之前以数据库方式创建的。

因此行 fillRest 在 fillGenres 之前运行。

我尝试将 Object.values.forEach 更改为 for..of、for..in、不同的异步、promises、调制代码...

基本上我可以在任何地方添加等待(可能大部分都在错误的地方)

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 中,因为它没有返回 promise 。我将这个包用于 mongoose 而不是具有 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);

最佳答案

我以前没有使用过 Spotify API,所以我不能说太多,但乍一看我发现了几个问题。首先,您正在检查 if (array !== 'undefined') {,它正在检查 array 变量是否是字面意义上的字符串 'undefined '(不是值 undefined)。我很确定那不是你想要的。如果您想确保 array 实际上是一个数组,您最好在此处使用 Array.isArray(array)

其次,您混合使用异步函数和 Promises,在我看来,您通常不应该这样做。您应该使用一个或另一个,这样它是一致的并且更容易遵循。如果您使用 await 而不是 .then,您将能够以更“同步”的方式编写它并且应该更容易理解。

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.isArray(array)) {
for (const element of array) {
const result = await Genre.findOrCreate({ name: element });
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,
};

try {
const result = await Artist.create([artist]);
console.log(result);
} catch (error) {
console.log(error);
}
}

async function spotifySeed() {
const entries = Object.values(data);

for (const entry of entries) {
const genreIDs = await fillGenres(entry.Genres);
await fillRest(entry, genreIDs);
}
}

await spotifySeed();

关于javascript - .then 中的代码在 Promise 之前执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56247861/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com