gpt4 book ai didi

async-await - 我们不需要比 Promise.all 更好的东西吗?

转载 作者:行者123 更新时间:2023-12-04 20:27:53 26 4
gpt4 key购买 nike

这是我使用 await/async 的漂亮代码

monthlyBuckets(req, res) {
const monthlyBuckets = []
const now = DateTime.local()
let date = config.beginningOfTime
while (date < now) {
monthlyBuckets.push({
epoch: date.toMillis(),
month: date.month,
year: date.year,
actions: await redis.get(`actions_monthly_${date.year}_${date.month}`),
interested: await redis.scard(`sinterested_monthly_${date.year}_${date.month}`),
adventurous: await redis.scard(`sadventurous_monthly_${date.year}_${date.month}`),
active: await redis.scard(`sactive_monthly_${date.year}_${date.month}`),
})
date = date.plus({month: 1})
}
res.status(200).json(monthlyBuckets)
}

我喜欢它,但是不并行地发出如此多的请求会导致请求时间接近 3 秒。

所以,这是我没有 async/await 的丑陋解决方案,只是 promise :
monthlyBuckets(req, res) {
const monthlyBuckets = []
const actions = []
const interested = []
const adventurous = []
const active = []
const now = DateTime.local()
let date = config.beginningOfTime
let entryCount = 0
while (date < now) {
monthlyBuckets.push({
epoch: date.toMillis(),
month: date.month,
year: date.year,
})
actions.push(redis.get(`actions_monthly_${date.year}_${date.month}`))
interested.push(redis.scard(`sinterested_monthly_${date.year}_${date.month}`))
adventurous.push(redis.scard(`sadventurous_monthly_${date.year}_${date.month}`))
active.push(redis.scard(`sactive_monthly_${date.year}_${date.month}`))
date = date.plus({month: 1})
entryCount++
}
const data = await Promise.all(actions.concat(interested).concat(adventurous).concat(active))
for (let i = 0; i < entryCount; i++) {
monthlyBuckets[i].actions = data[i]
monthlyBuckets[i].interested = data[entryCount + i]
monthlyBuckets[i].adventurous = data[entryCount * 2 + i]
monthlyBuckets[i].active = data[entryCount * 3 + i]
}
res.status(200).json(monthlyBuckets)
}
}

这不是很好,但它可以在 200 毫秒内完成工作

我可以有漂亮和高效吗?

最佳答案

上面代码的问题在于您正在尝试:

  • 使用 一个 Promise.all() 所有的 promise
  • 处理 中所有响应的输出一回拨

  • 虽然这不是错误,但它可能导致难以“阅读”代码。

    代码可以写成:
    while (date < now) {
    let dateData = {
    epoch: date.toMillis(),
    month: date.month,
    year: date.year,
    };
    let promiseData = Promise.all([
    dateData, // dataData is cast(made to) automatically into a promise
    redis.get(`actions_monthly_${date.year}_${date.month}`),
    redis.scard(`sinterested_monthly_${date.year}_${date.month}`),
    redis.scard(`sadventurous_monthly_${date.year}_${date.month}`),
    redis.scard(`sactive_monthly_${date.year}_${date.month}`)
    ]).then([data, actions, interested, adventurous, active] => {
    // process the data here for each month
    data.actions = actions;
    data.interested = interested;
    data.adventurous = adventurous;
    data.active = active;
    return data;
    });
    monthlyBuckets.push(promiseData);
    date = date.plus({month: 1});
    }

    const data = await Promise.all(monthlyBuckets);
    res.status(200).json(data);

    改变的是
  • 分组 promise 每个月
  • 处理一个月`s 一组 promise ,不是所有的 promise 一起并根据需要返回数据。

  • 分组 promise 没有错,例如:
    Promise.all([
    Promise.all([ ...]),
    Promise.all([ ...]),
    singlePromise,
    ...
    ]);

    处理 promise ,例如:
    promiseProcessed1 = promise1.then(callback1);
    promiseProcessed12 = Promise.all([promise1, promise2]).then(callback2);

    或重用 promise ,例如:
    promiseProcessed1 = promise1.then(callback1);
    promiseProcessed12 = Promise.all([promise1, promise2]).then(callback2);
    resultDatapromise = Promise.all([promise1, promise2, promiseProcessed1, promiseProcessed12]).then(callback2);

    引用文献
  • Reuse promises
  • ES6 Destructuring assignment
  • 关于async-await - 我们不需要比 Promise.all 更好的东西吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54375060/

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