猿问

如何解决承诺?

我有一个脚本,可以执行很多承诺。基本上,我的脚本“Task”在将新记录添加到数据库时启动。基于此记录,我向 API 发出请求并获取结果数组。然后,我将这些结果保存到数据库中。然后,我使用相同的结果数组向用于获取图像的另一个 api 发出每个结果的请求。然后,所有这些图像都将上传到S3。

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

这是因为我不能等到第一个任务的所有承诺都得到解决才能开始执行下一个任务。

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


慕尼黑8549860
浏览 107回答 2
2回答

子衿沉夜

下面是您的任务的实现。这澄清了承诺执行的顺序。onRecordAddTaskconst 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

LEATH

简短的回答是:是的您可以同时运行所有承诺。使用并传递一系列承诺。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')}
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答