2 回答
TA贡献1828条经验 获得超3个赞
下面是您的任务的实现。这澄清了承诺执行的顺序。onRecordAddTask
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,并返回一个数组。然后,对于每个结果的结果,我们而我们每个结果并行;我们等待每个结果的图像为.最后,我们将所有图像作为 上传到 s3。requestAPIresultssaveToDatabasegetImagesarraysOfImagesuploadToS3
我应该提到,我写了一个库来处理复杂的异步任务,比如你的任务;以下是如何使用该库简化上述代码。
const { pipe, fork, map, get } = require('rubico')
const onRecordAddTask = pipe([
requestAPI,
fork([
map(getImages),
map(saveToDatabase),
]),
get(0),
map(map(uploadToS3)),
])
我不能等到第一个任务的所有承诺都得到解决,才能开始执行最新的任务。
因为返回单个承诺,你可以自由地让它逃跑,这样它就不会阻止你执行最新的任务。onRecordAddTask
如果我在数据库上插入许多“任务”记录会发生什么
您将开始执行任务的许多操作onRecordAddTask
TA贡献1936条经验 获得超6个赞
简短的回答是:是的
您可以同时运行所有承诺。
使用并传递一系列承诺。Promise.all([])
您的代码将如下所示:
async function main() {
const promises = []
for(const task of tasks){
promises.push(task)
}
console.log('All promise at once')
await Promise.all(promises)
console.log('All promise at once done')
}
添加回答
举报