【发布时间】:2019-11-27 02:29:56
【问题描述】:
我有两个代码块。首先是使用async await
async sendEmailNotifications() {
try {
const users = await User.find(...)
const promises = users.map(async(user) => {
const _promises = user.appId.map(async(app) => {
const todayVisitorsCount = await Session.count({...})
const yesterdayVisitorsCount = await UserSession.count({...})
const emailObj = {
todayVisitorsCount,
yesterdayVisitorsCount
}
const sendNotification = await emailService.analyticsNotification(emailObj)
})
await Promise.all(_promises)
})
return promises
} catch (err) {
return err
}
}
(await sendEmailNotifications())
然后我使用Promise.all
sendEmailNotifications() {
const users = await User.find(...)
const promises = users.map((user) => {
const allPromises = []
user.appId.map((app) => {
allPromises.push(UserSession.count({...}))
allPromises.push(Session.count({...}))
})
const data = await Promise.all(allPromises)
const emailObj = {
todayVisitorsCount: data[0],
yesterdayVisitorsCount: data[1]
}
const sendNotification = await emailService.analyticsNotification(emailObj)
})
return promises
}
sendNotification.then((data) => console.log(data))
现在我需要知道哪段代码执行得更快?一个是系列(异步等待),一个是并行(Promise.all)。哪个性能更好?
【问题讨论】:
-
嵌套异步等待将序列化您的调用,而 promise.all 将使它们并行化。所以这取决于你需要什么。
-
看看这个 - hackernoon.com/…
-
在您的第一个 sn-p 中,您映射到
user.appId。那个循环完全从你的第二个 sn-p 中消失了,为什么?他们现在几乎没有可比性。 -
在您的第一个 sn-p 中,您返回了一系列承诺,但没有等待它们。您需要再次在它们上使用
Promise.all:return Promise.all(promises)。我也怀疑你是否想返回一个错误对象——如果你不能处理一个异常,就让它冒泡。 -
@Bergi 你正在映射 user.appId 在这两个 sn-p 中我都在循环
user.appId(请看)。 在你的第一次......时间:return Promise.all(promises) 不,我正在返回promises并使用 await(await sendEmailNotifications())。 如果你无法处理异常我会处理它(问题是出于不同目的)
标签: javascript node.js asynchronous promise async-await