如何等待带有嵌套foreach循环的Async/Await完成



如何等待getVideoCountForAuthor((完成所有异步查询?

router.get('/', function (req, res, next) {
console.log("START");
(async () => {
let uniqueAuthors = await getInfluencersForHashTags("winter", {  sessionList: [TTSessions]});
uniqueAuthors = await getVideoCountForAuthor(uniqueAuthors);
})()
.then(() => {
console.log("EVERYTHING DONE");
})  ;

});
async function getVideoCountForAuthor(authors) {
return _.each(authors, async function (author, i, authors) {
let feed = await TikTokScraper.user(author.username, {number: 10, sessionList: [TTSessions]});
let authorMeta = author.authorMeta;
let videocounts = _.map(feed.collector, function (post) {
return post.playCount;
});
console.log("set videocount");
});
}

日志:

START
EVERYTHING DONE
set videocount
set videocount
set videocount
set videocount

如果你想使用lodash,你可以使用map而不是each,因为map会返回一组答案(在你的情况下是空的Promises(,所以要将该场景更改为每个场景的相同场景,你可以这样做:

async function getVideoCountForAuthor(authors) {
return _.map(authors, async function (author, i, authors) {
let feed = await TikTokScraper.user(author.username, {number: 10, sessionList: [TTSessions]});
let authorMeta = author.authorMeta;
let videocounts = _.map(feed.collector, function (post) {
return post.playCount;
});
console.log("set videocount");
return author;
});
}

现在,答案将是一个Promise数组,因此您可以在getVideoCountForAuthor或父函数中生成Promise.all。

第一种情况是:


async function getVideoCountForAuthor(authors) {
return await Promise.all(_.map(authors, async function (author, i, authors) {
let feed = await TikTokScraper.user(author.username, {number: 10, sessionList: [TTSessions]});
let authorMeta = author.authorMeta;
let videocounts = _.map(feed.collector, function (post) {
return post.playCount;
});
console.log("set videocount");
return author;
}));
}

您的输出将是:

START
set videocount
set videocount
set videocount
set videocount
EVERYTHING DONE

哇。它使用for循环。这是最好的选择吗?

async function getVideoCountForAuthor(authors) {
for (const author of authors) {
let feed = await TikTokScraper.user(author.username, {number: 10, sessionList: [TTSessions]});
let authorMeta = author.authorMeta;
let videocounts = _.map(feed.collector, function (post) {
return post.playCount;
});
//let newAuthor = author;
// uniqueAuthors[i].medianVideoCounts = median(videocounts);
console.log("set videocount");
};
}

最新更新