如何兑现承诺?

编程入门 行业动态 更新时间:2024-10-05 23:18:27

如何兑现承诺?

如何兑现承诺?

我有一个执行很多承诺的脚本。基本上,我的脚本是在将新记录添加到数据库时启动的,我将其称为“任务”,基于此任务,我请求一些API并获取x个结果,然后将这些结果保存在数据库中。然后,我查询从上一步获得的每个结果,并再次查询用于根据每个结果获取一些图像的其他api,然后将所有这些图像上载到S3。

因此,对于每个任务,我执行并触发许多请求,对数据库的查询,更新等。所有这些都在promise中解决。所以我的问题是,如果我在数据库中插入许多“任务”记录,会发生什么情况。诺言执行的顺序是什么?程序将等待直到第一个任务(和子任务)结束,否则程序将按任务独立抛出结果,而其他任务也正在解析?

这是因为我迫不及待地解决了第一个任务的所有诺言,开始执行最新任务。

如果您还有其他问题,请告诉我,我可以更新问题。

回答如下:

这里是您的任务的实现,onRecordAddTask。阐明promise执行的顺序。

const requestAPI = record => {/* make API request */}

const saveToDatabase = result => {/* save result to database */}

const getImages = apiResult => {/* make images API request */}

const flatten = arr => arr.flat(1)

const uploadToS3 = image => {/* upload to s3 code */}

const onRecordAddTask = async record => {
  const results = await requestAPI(record)
  const [arraysOfImages,] = await Promise.all([
    await Promise.all(results.map(getImages)),
    await Promise.all(results.map(saveToDatabase)),
  ])
  await Promise.all(flatten(arraysOfImages).map(uploadToS3))
}

onRecordAddTask应该与每个新插入的记录一起调用到数据库中。该任务使用您的记录请求API requestAPI,并返回results的数组。然后,对于每个结果,我们saveToDatabase,而每个结果getImages是并行的;我们等待每个结果的图像为arraysOfImages。最后,我们将所有图像作为uploadToS3上传到s3。

我应该提到,我编写了一个库来处理诸如您的复杂异步任务;这是您使用该库简化上述代码的方法。

const { pipe, fork, map, get } = require('rubico')

const onRecordAddTask = pipe([
  requestAPI,
  fork([
    map(getImages),
    map(saveToDatabase),
  ]),
  get(0),
  map(map(uploadToS3)),
])

更多推荐

如何兑现承诺?

本文发布于:2024-05-07 21:40:12,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1757373.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!