如何兑现承诺?
我有一个执行很多承诺的脚本。基本上,我的脚本是在将新记录添加到数据库时启动的,我将其称为“任务”,基于此任务,我请求一些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)),
])
更多推荐
如何兑现承诺?
发布评论